2 |
- |
1 |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
|
2 |
<html>
|
|
|
3 |
<head>
|
|
|
4 |
<title>Information for Ghostscript developers</title>
|
|
|
5 |
<link rel="stylesheet" type="text/css" href="gs.css" title="Ghostscript Style">
|
|
|
6 |
<!-- $Id: Develop.htm,v 1.159 2005/10/20 19:46:23 ray Exp $ -->
|
|
|
7 |
</head>
|
|
|
8 |
|
|
|
9 |
<body>
|
|
|
10 |
<!-- [1.0 begin visible header] ============================================ -->
|
|
|
11 |
|
|
|
12 |
<!-- [1.1 begin headline] ================================================== -->
|
|
|
13 |
|
|
|
14 |
<h1>Information for Ghostscript developers</h1>
|
|
|
15 |
|
|
|
16 |
<!-- [1.1 end headline] ==================================================== -->
|
|
|
17 |
|
|
|
18 |
<!-- [1.2 begin table of contents] ========================================= -->
|
|
|
19 |
|
|
|
20 |
<h2>Table of contents</h2>
|
|
|
21 |
|
|
|
22 |
<blockquote><ul>
|
|
|
23 |
<li><a href="#Introduction">Introduction</a>
|
|
|
24 |
<li><a href="#Architecture">Architecture</a>
|
|
|
25 |
<ul>
|
|
|
26 |
<li><a href="#Design_goals">Design goals</a>
|
|
|
27 |
<li><a href="#Design_principles">Design principles</a>
|
|
|
28 |
<li><a href="#Large_scale_structure">Large-scale structure</a>
|
|
|
29 |
<li><a href="#Object_oriented_constructs">Object-oriented constructs</a>
|
|
|
30 |
</ul>
|
|
|
31 |
<li><a href="#File_roadmap">File roadmap</a>
|
|
|
32 |
<ul>
|
|
|
33 |
<li><a href="#Substrate">Substrate</a>
|
|
|
34 |
<li><a href="#Graphics_library">Graphics library</a>
|
|
|
35 |
<ul>
|
|
|
36 |
<li><a href="#Library_support">Support</a>,
|
|
|
37 |
<a href="#Paths">Paths</a>,
|
|
|
38 |
<a href="#Text">Text</a>,
|
|
|
39 |
<a href="#Images">Images</a>,
|
|
|
40 |
<a href="#Paint">Paint</a>,
|
|
|
41 |
<a href="#Clipping">Clipping</a>,
|
|
|
42 |
<a href="#Other_graphics">Other graphics</a>,
|
|
|
43 |
<a href="#Driver_support">Driver support</a>,
|
|
|
44 |
<a href="#FAPI_support_gx">Font API support</a>
|
|
|
45 |
<a href="#Visual_trace">Visual Trace</a>
|
|
|
46 |
</ul>
|
|
|
47 |
<li><a href="#Device_drivers">Device drivers</a>
|
|
|
48 |
<ul>
|
|
|
49 |
<li><a href="#Internal_devices">Internal devices</a>,
|
|
|
50 |
<a href="#PS_and_PDF_writers">PostScript and PDF writers</a>,
|
|
|
51 |
<a href="#High_level_devices">Other high-level devices</a>,
|
|
|
52 |
<a href="#Other_maintained_drivers">Other maintained drivers</a>,
|
|
|
53 |
<a href="#Contributed_drivers">Contributed drivers</a>
|
|
|
54 |
</ul>
|
|
|
55 |
<li><a href="#PostScript_interpreter">PostScript interpreter</a>
|
|
|
56 |
<ul>
|
|
|
57 |
<li><a href="#Main_program">Main program</a>,
|
|
|
58 |
<a href="#Data_structures">Data structures</a>,
|
|
|
59 |
<a href="#Stacks">Stacks</a>,
|
|
|
60 |
<a href="#Interpreter_loop">Interpreter loop</a>,
|
|
|
61 |
<a href="#Scanning_parsing">Scanning/parsing</a>,
|
|
|
62 |
<a href="#Standard_operators">Standard operators</a>,
|
|
|
63 |
<a href="#Non_standard_operators">Non-standard operators</a>,
|
|
|
64 |
<a href="#Interpreter_support">Interpreter support</a>,
|
|
|
65 |
<a href="#PostScript_code">PostScript code</a>
|
|
|
66 |
</ul>
|
|
|
67 |
<li><a href="#PDF_interpreter">PDF interpreter</a>
|
|
|
68 |
<li><a href="#PPD">PostScript Printer Description</a>
|
|
|
69 |
<li><a href="#Build_process">Build process</a>
|
|
|
70 |
<ul>
|
|
|
71 |
<li><a href="#Makefile_structure">Makefile structure</a>,
|
|
|
72 |
<a href="#dev_files">.dev files</a>,
|
|
|
73 |
<a href="#Generators">Generators</a>,
|
|
|
74 |
<a href="#Build_support">Support</a>
|
|
|
75 |
</ul>
|
|
|
76 |
<li><a href="#Utilities">Utilities</a>
|
|
|
77 |
<ul>
|
|
|
78 |
<li><a href="#Utilities_in_PostScript">Utilities in PostScript</a>
|
|
|
79 |
<li><a href="#Utility_scripts">Utility scripts</a>
|
|
|
80 |
</ul>
|
|
|
81 |
</ul>
|
|
|
82 |
<li><a href="#Memory_management">Memory management</a>
|
|
|
83 |
<ul>
|
|
|
84 |
<li><a href="#Memory_manager_architecture">Memory manager architecture</a>
|
|
|
85 |
<ul>
|
|
|
86 |
<li><a href="#Objects_vs_strings">Objects vs strings</a>,
|
|
|
87 |
<a href="#Structure_descriptors">Structure descriptors</a>,
|
|
|
88 |
<a href="#Garbage_collection">Garbage collection</a>,
|
|
|
89 |
<a href="#Movability">Movability</a>,
|
|
|
90 |
<a href="#Parent_hierarchy">Parent hierarchy</a>,
|
|
|
91 |
<a href="#Allocator_API">Allocator API</a>
|
|
|
92 |
</ul>
|
|
|
93 |
<li><a href="#Freeing_storage">Freeing storage</a>
|
|
|
94 |
<ul>
|
|
|
95 |
<li><a href="#Explicit_freeing">Explicit freeing</a>,
|
|
|
96 |
<a href="#Reference_counting">Reference counting</a>,
|
|
|
97 |
<a href="#Real_garbage_collection">(Real) garbage collection</a>
|
|
|
98 |
</ul>
|
|
|
99 |
<li><a href="#Special_implementations">Special implementations</a>
|
|
|
100 |
<ul>
|
|
|
101 |
<li><a href="#malloc">malloc</a>,
|
|
|
102 |
<a href="#Locking">Locking</a>,
|
|
|
103 |
<a href="#Retrying">Retrying</a>
|
|
|
104 |
</ul>
|
|
|
105 |
<li><a href="#Standard_implementation">Standard implementation</a>
|
|
|
106 |
<li><a href="#PostScript_interpreter_extensions">PostScript interpreter extensions</a>
|
|
|
107 |
<ul>
|
|
|
108 |
<li><a href="#Refs">Refs (PostScript "objects")</a>,
|
|
|
109 |
<a href="#save_forgetsave_restore">save/.forgetsave/restore</a>,
|
|
|
110 |
<a href="#Stable_allocators">Stable allocators</a>,
|
|
|
111 |
<a href="#Interpreter_GC">Garbage collection</a>
|
|
|
112 |
</ul>
|
|
|
113 |
</ul>
|
|
|
114 |
<li><a href="#Portability">Portability</a>
|
|
|
115 |
<ul>
|
|
|
116 |
<li><a href="#Structural">Structural</a>
|
|
|
117 |
<ul>
|
|
|
118 |
<li><a href="#CPU_and_compiler">CPU and compiler</a>,
|
|
|
119 |
<a href="#Library_headers">Library headers</a>,
|
|
|
120 |
<a href="#Cross_platform_APIs">Cross-platform APIs</a>,
|
|
|
121 |
<a href="#Makefiles">Makefiles</a>
|
|
|
122 |
</ul>
|
|
|
123 |
<li><a href="#Coding">Coding</a>
|
|
|
124 |
<ul>
|
|
|
125 |
<li><a href="#Explicit_dependencies">Explicit dependencies</a>,
|
|
|
126 |
<a href="#Implicit_dependencies">Implicit dependencies</a>
|
|
|
127 |
</ul>
|
|
|
128 |
<li><a href="#Platform_specific_code">Platform-specific code</a>
|
|
|
129 |
</ul>
|
|
|
130 |
<li><a href="#Adding_features_and_options">Adding features and options</a>
|
|
|
131 |
<li><a href="#Troubleshooting">Troubleshooting</a>
|
|
|
132 |
</ul></blockquote>
|
|
|
133 |
|
|
|
134 |
<!-- [1.2 end table of contents] =========================================== -->
|
|
|
135 |
|
|
|
136 |
<!-- [1.3 begin hint] ====================================================== -->
|
|
|
137 |
|
|
|
138 |
<p>For other information, see the <a href="Readme.htm">Ghostscript
|
|
|
139 |
overview</a> and the documentation related to <a
|
|
|
140 |
href="Maintain.htm">maintaining Ghostscript</a>.
|
|
|
141 |
|
|
|
142 |
<!-- [1.3 end hint] ======================================================== -->
|
|
|
143 |
|
|
|
144 |
<hr>
|
|
|
145 |
|
|
|
146 |
<!-- [1.0 end visible header] ============================================== -->
|
|
|
147 |
|
|
|
148 |
<!-- [2.0 begin contents] ================================================== -->
|
|
|
149 |
|
|
|
150 |
<h2><a name="Introduction"></a>Introduction</h2>
|
|
|
151 |
|
|
|
152 |
<p>
|
|
|
153 |
This document provides a wealth of information about Ghostscript's
|
|
|
154 |
internals, primarily for developers actively working on Ghostscript. It is
|
|
|
155 |
primarily <strong>descriptive</strong>, documenting the way things are; the
|
|
|
156 |
companion <a href="C-style.htm">C style guide</a> is primarily
|
|
|
157 |
<strong>prescriptive</strong>, documenting what developers should do when
|
|
|
158 |
writing new code.
|
|
|
159 |
|
|
|
160 |
<p>
|
|
|
161 |
THIS FILE IS A WORK IN PROGRESS. MANY SECTIONS ARE PLACE-HOLDERS.
|
|
|
162 |
|
|
|
163 |
<h2><a name="Architecture"></a>Architecture</h2>
|
|
|
164 |
|
|
|
165 |
<h3><a name="Design_goals"></a>Design goals</h3>
|
|
|
166 |
|
|
|
167 |
<p>
|
|
|
168 |
Ghostscript has the following high-level design goals (not listed in order
|
|
|
169 |
of importance):
|
|
|
170 |
|
|
|
171 |
<ul>
|
|
|
172 |
<li>Functionality
|
|
|
173 |
<ul>
|
|
|
174 |
<li>Ability to interpret the current PostScript and PDF languages, as
|
|
|
175 |
defined (and occasionally, in the case of conflict, as implemented) by
|
|
|
176 |
Adobe.
|
|
|
177 |
<li>Ability to convert PostScript to and from PDF, comparable to
|
|
|
178 |
Adobe products.
|
|
|
179 |
<li>Ability to produce output for a wide range of resolutions (from
|
|
|
180 |
TV-resolution displays to imagesetters) and color models (black and white,
|
|
|
181 |
multilevel gray, bilevel or multi-level RGB and CMYK, 6- or 8-color
|
|
|
182 |
inkjet printers, spot color).
|
|
|
183 |
</ul>
|
|
|
184 |
<li>Performance
|
|
|
185 |
<ul>
|
|
|
186 |
<li>Ability to render PostScript and PDF with commercial-quality performance
|
|
|
187 |
(memory usage, speed, and output quality) on all platforms.
|
|
|
188 |
<li>Specifically, ability to render PostScript effectively in embedded
|
|
|
189 |
environments with constrained RAM, including the ability to put the code and
|
|
|
190 |
supporting data in ROM.
|
|
|
191 |
</ul>
|
|
|
192 |
<li>Licensing
|
|
|
193 |
<ul>
|
|
|
194 |
<li>Licensing that supports both the Open Source / Free software communities
|
|
|
195 |
and a commercial licensing business.
|
|
|
196 |
<li>Freedom from licensing restrictions or fees imposed by third parties.
|
|
|
197 |
</ul>
|
|
|
198 |
<li>Other
|
|
|
199 |
<ul>
|
|
|
200 |
<li>Easy source portability to any platform (CPU, operating system, and
|
|
|
201 |
development tools) that has an ANSI C compiler.
|
|
|
202 |
<li>Support for writing new interpreters and new drivers with no change to
|
|
|
203 |
any existing code; specifically, ability to support PCL 5e, PCL 5c, and PCL
|
|
|
204 |
XL interpreters, and the ever-changing roster of inkjet printers.
|
|
|
205 |
</ul>
|
|
|
206 |
</ul>
|
|
|
207 |
|
|
|
208 |
<p>
|
|
|
209 |
These goals often conflict: part of Ghostscript's claim to quality is that
|
|
|
210 |
the conflicts have been resolved well.
|
|
|
211 |
|
|
|
212 |
<h3><a name="Design_principles"></a>Design principles</h3>
|
|
|
213 |
|
|
|
214 |
<p>
|
|
|
215 |
Part of what has kept Ghostscript healthy through many years of major code
|
|
|
216 |
revisions and functional expansion is consistent and conscientious adherence
|
|
|
217 |
to a set of design principles. We hope the following list captures the most
|
|
|
218 |
important ones.
|
|
|
219 |
|
|
|
220 |
<h4>Non-preemption</h4>
|
|
|
221 |
|
|
|
222 |
<p>
|
|
|
223 |
Ghostscript is designed to be used as a component. As such, it must share
|
|
|
224 |
its environment with other components. Therefore, it must not require
|
|
|
225 |
ownership of, or make decisions about, inherently shared resources.
|
|
|
226 |
Specifically, it must not assume that it can "own" either the locus of
|
|
|
227 |
control or the management of the address space.
|
|
|
228 |
|
|
|
229 |
<p>
|
|
|
230 |
Not owning control means that whenever Ghostscript passes control to its
|
|
|
231 |
caller, it must do so in a way that doesn't constrain what the caller can do
|
|
|
232 |
next. The caller must be able to call any other piece of software, wait for
|
|
|
233 |
an external event, execute another task, etc., without having to worry about
|
|
|
234 |
Ghostscript being in an unknown state. While this is easy to arrange in a
|
|
|
235 |
multi-threaded environment (by running Ghostscript in a separate thread),
|
|
|
236 |
multi-threading APIs are not well standardized at this time (December 2000),
|
|
|
237 |
and may not be implemented efficiently, or at all, on some platforms.
|
|
|
238 |
Therefore, Ghostscript must choose between only two options for interacting
|
|
|
239 |
with its caller: to <em>return</em>, preserving its own state in data
|
|
|
240 |
structures, or to <em>call back</em> through a caller-supplied procedure.
|
|
|
241 |
Calling back constrains the client program unacceptably: the callback
|
|
|
242 |
procedure only has the options of either returning, or aborting Ghostscript.
|
|
|
243 |
In particular, if it wants (for whatever reason) to multi-task Ghostscript
|
|
|
244 |
with another program, it cannot do so in general, especially if the other
|
|
|
245 |
program also uses callback rather than suspension. Therefore, Ghostscript
|
|
|
246 |
tries extremely hard to return, rather than calling back, for all caller
|
|
|
247 |
interaction. In particular:
|
|
|
248 |
|
|
|
249 |
<ul>
|
|
|
250 |
|
|
|
251 |
<li>For callers that want to pass input to Ghostscript piece by piece,
|
|
|
252 |
Ghostscript returns with an <b><tt>e_NeedInput</tt></b> code rather than
|
|
|
253 |
using a callback. This allows the caller complete flexibility in its
|
|
|
254 |
control structure for managing the source of input. (It might, for example,
|
|
|
255 |
be generating the input dynamically.)
|
|
|
256 |
|
|
|
257 |
<li>In the future, the same arrangement should be used for input from
|
|
|
258 |
<b><tt>stdin</tt></b> and output to <b><tt>stdout</tt></b> and
|
|
|
259 |
<b><tt>stderr</tt></b>.
|
|
|
260 |
|
|
|
261 |
<li>Likewise, scheduling of Ghostscript's own threads (contexts), currently
|
|
|
262 |
done with a callback, should be done with suspension. The Display
|
|
|
263 |
Ghostscript project (GNU DGS) is working on this.
|
|
|
264 |
|
|
|
265 |
</ul>
|
|
|
266 |
|
|
|
267 |
<p>
|
|
|
268 |
The one area where suspension is not feasible with Ghostscript's current
|
|
|
269 |
architecture is device output. Device drivers are called from deep within
|
|
|
270 |
the graphics library. (If Ghostscript were being redesigned from scratch,
|
|
|
271 |
we might try to do this with suspension as well, or at least optional
|
|
|
272 |
suspension.)
|
|
|
273 |
|
|
|
274 |
<p>
|
|
|
275 |
Not owning management of the address space means that even though
|
|
|
276 |
Ghostscript supports garbage collection for its own data, it must not do any
|
|
|
277 |
of the things that garbage collection schemes for C often require: it must
|
|
|
278 |
not replace 'malloc' and 'free', must not require its clients to use its own
|
|
|
279 |
allocator, must not rely on manipulating the read/write status of memory
|
|
|
280 |
pages, must not require special compiler or run-time support (e.g., APIs for
|
|
|
281 |
scanning the C stack), must not depend on the availability of
|
|
|
282 |
multi-threading, and must not take possession of one of a limited number of
|
|
|
283 |
timer interrupts. However, in order not to constrain its own code unduly,
|
|
|
284 |
it must also not require using special macros or calls to enter or leave
|
|
|
285 |
procedures or assign pointers, and must not constrain the variety of C data
|
|
|
286 |
structures any more than absolutely necessary. It achieves all of these
|
|
|
287 |
goals, at the expense of some complexity, some performance cost (mostly for
|
|
|
288 |
garbage collection), and some extra manual work required for each structure
|
|
|
289 |
type allocated by its allocator. The details appear in the <a
|
|
|
290 |
href="#Memory_management">Memory management</a> section below.
|
|
|
291 |
|
|
|
292 |
<h4>Multi-instantiability</h4>
|
|
|
293 |
|
|
|
294 |
<p>
|
|
|
295 |
From many years of experience with the benefits of object-oriented design,
|
|
|
296 |
we have learned that when the word "the" appears in a software design --
|
|
|
297 |
"the" process scheduler, "the" memory manager, "the" output device, "the"
|
|
|
298 |
interpreter, "the" stack -- it often flags an area in which the software
|
|
|
299 |
will have difficulty adapting to future needs. For this reason, Ghostscript
|
|
|
300 |
attempts to make every internal structure capable of existing in multiple
|
|
|
301 |
instances. For example, Ghostscript's memory manager is not a one-of-a-kind
|
|
|
302 |
entity with global state and procedures: it is (or rather they are, since
|
|
|
303 |
Ghostscript has multiple memory managers, some of which have multiple
|
|
|
304 |
instances) objects with their own state and (virtual) procedures.
|
|
|
305 |
Ghostscript's PostScript interpreter has no writable non-local data
|
|
|
306 |
(necessary, but not sufficient, to allow multiple instances), and in the
|
|
|
307 |
future will be extended to be completely reentrant and instantiable. The
|
|
|
308 |
device driver API is designed to make this easy for drivers as well. The
|
|
|
309 |
graphics library is currently not completely reentrant or instantiable: we
|
|
|
310 |
hope this will occur in the future.
|
|
|
311 |
|
|
|
312 |
<h4>Late configuration binding</h4>
|
|
|
313 |
|
|
|
314 |
<p>
|
|
|
315 |
Ghostscript is designed to make configuration choices as late as possible,
|
|
|
316 |
subject to simplicity and performance considerations. The major binding
|
|
|
317 |
times for such choices are compilation, linking, startup, and dynamic.
|
|
|
318 |
|
|
|
319 |
<ul>
|
|
|
320 |
|
|
|
321 |
<li>Compilation binds only CPU and compiler characteristics (including data
|
|
|
322 |
type size, presence of floating point hardware, and data alignment), and
|
|
|
323 |
whether the code will be used for production, debugging, or profiling.
|
|
|
324 |
|
|
|
325 |
<li>Linking binds the choice of what features and device drivers will be
|
|
|
326 |
included in the executable. (Work is underway to make the choice of drivers
|
|
|
327 |
dynamic.)
|
|
|
328 |
|
|
|
329 |
<li>Startup binds essentially nothing. Almost every option and parameter
|
|
|
330 |
that can appear on the command line can also be changed dynamically.
|
|
|
331 |
|
|
|
332 |
<li>The selection of output device, all parameters associated with the
|
|
|
333 |
device, the selection of debugging printout and self-checking (in debugging
|
|
|
334 |
configurations), the macro-allocation of memory, and almost all other
|
|
|
335 |
operational parameters are dynamic.
|
|
|
336 |
|
|
|
337 |
</ul>
|
|
|
338 |
|
|
|
339 |
<p>
|
|
|
340 |
In addition, a number of major implementation decisions are made dynamically
|
|
|
341 |
depending on the availability of resources. For example, Ghostscript
|
|
|
342 |
chooses between banded and non-banded rendering depending on memory
|
|
|
343 |
availability.
|
|
|
344 |
|
|
|
345 |
<h3><a name="Large_scale_structure"></a>Large-scale structure</h3>
|
|
|
346 |
|
|
|
347 |
<p>
|
|
|
348 |
At the largest design scale, Ghostscript consists of 4 layers. Layer N
|
|
|
349 |
is allowed to use the facilities of all layers M <= N.
|
|
|
350 |
|
|
|
351 |
<ol>
|
|
|
352 |
|
|
|
353 |
<li>The bottom layer is called the <a href="#Substrate">substrate</a>. It
|
|
|
354 |
includes facilities like memory management, streams, fixed-point arithmetic,
|
|
|
355 |
and low-level interfaces to the operating system. The substrate is written
|
|
|
356 |
in C, with a little C++ and/or assembler code for some platforms.
|
|
|
357 |
|
|
|
358 |
<li>The layer above the substrate is the graphics layer. It consists of two
|
|
|
359 |
separate sub-parts. The graphics layer is written in C.
|
|
|
360 |
|
|
|
361 |
<ul>
|
|
|
362 |
|
|
|
363 |
<li>The <a href="#Graphics_library">graphics library</a> manages graphics
|
|
|
364 |
state information for, and decomposes and renders 2-D images described
|
|
|
365 |
using, a graphics model that is approximately the union of those of
|
|
|
366 |
PostScript, PDF, and PCL 5e/5c/XL.
|
|
|
367 |
|
|
|
368 |
<li>The <a href="#Device_drivers">device drivers</a> are called by the
|
|
|
369 |
graphics library to produce actual output. The graphics library, and all
|
|
|
370 |
higher layers, call device driver procedures only through virtual functions.
|
|
|
371 |
|
|
|
372 |
</ul>
|
|
|
373 |
|
|
|
374 |
<li>The principal clients of the graphics layer are language interpreters.
|
|
|
375 |
Ghostscript as distributed includes the <a
|
|
|
376 |
href="#PostScript_interpreter">PostScript interpreter</a>; there are also
|
|
|
377 |
interpreters for PCL 5e, PCL 5c, and PCL XL, which are not currently freely
|
|
|
378 |
redistributable and are not included in the standard Ghostscript package.
|
|
|
379 |
The PostScript interpreter is written partly in C and partly in PostScript.
|
|
|
380 |
|
|
|
381 |
<li>The <a href="#PDF_interpreter">PDF interpreter</a> is actually a client
|
|
|
382 |
of the PostScript interpreter: it is written entirely in PostScript.
|
|
|
383 |
|
|
|
384 |
</ol>
|
|
|
385 |
|
|
|
386 |
<p>
|
|
|
387 |
The most important interface in Ghostscript is the API between the graphics
|
|
|
388 |
library and the device drivers: new printers (and, to a lesser extent,
|
|
|
389 |
window systems, displays, plotters, film recorders, and graphics file
|
|
|
390 |
formats) come on the scene frequently, and it must be possible to produce
|
|
|
391 |
output for them with a minimum of effort and distruption. This API is the
|
|
|
392 |
only one that is extensively documented (see <a
|
|
|
393 |
href="Drivers.htm">Drivers.htm</a>) and kept stringently backward-compatible
|
|
|
394 |
through successive releases.
|
|
|
395 |
|
|
|
396 |
<h3><a name="Object_oriented_constructs"></a>Object-oriented constructs</h3>
|
|
|
397 |
|
|
|
398 |
<p>
|
|
|
399 |
Ghostscript makes heavy use of object-oriented constructs, including
|
|
|
400 |
analogues of classes, instances, subclassing, and class-associated
|
|
|
401 |
procedures. Since Ghostscript is written in C, not C++, implementing these
|
|
|
402 |
constructs requires following coding conventions. The <a
|
|
|
403 |
href="C-style.htm#Objects">"Objects"</a> section of the C style guide
|
|
|
404 |
explains these.
|
|
|
405 |
|
|
|
406 |
<p>
|
|
|
407 |
The memory manager API provides run-time type information about each class,
|
|
|
408 |
but this information does not include anything about subclassing. See under
|
|
|
409 |
<a href="#Structure_descriptors">Structure descriptors</a> below.
|
|
|
410 |
|
|
|
411 |
<hr>
|
|
|
412 |
|
|
|
413 |
<h2><a name="File_roadmap"></a>File roadmap</h2>
|
|
|
414 |
|
|
|
415 |
<p>
|
|
|
416 |
This section of the document provides a roadmap to all of the Ghostscript
|
|
|
417 |
source files.
|
|
|
418 |
|
|
|
419 |
<h3><a name="Substrate"></a>Substrate</h3>
|
|
|
420 |
|
|
|
421 |
<h4>Runtime Context</h4>
|
|
|
422 |
|
|
|
423 |
<dl>
|
|
|
424 |
<dt>
|
|
|
425 |
The libctx provides pointers to memory, stdio, and various other runtime
|
|
|
426 |
portablility services.
|
|
|
427 |
<dd>
|
|
|
428 |
<a href="../src/gslibctx.h">src/gslibctx.h</a>,
|
|
|
429 |
<a href="../src/gslibctx.c">src/gslibctx.c</a>.
|
|
|
430 |
</dl>
|
|
|
431 |
|
|
|
432 |
<h4>Memory manager</h4>
|
|
|
433 |
|
|
|
434 |
<p>
|
|
|
435 |
See <a href="#Memory_management">below</a>.
|
|
|
436 |
|
|
|
437 |
<h4>Streams</h4>
|
|
|
438 |
|
|
|
439 |
<dl>
|
|
|
440 |
|
|
|
441 |
<dt>
|
|
|
442 |
Framework, file and string streams:
|
|
|
443 |
<dd>
|
|
|
444 |
<a href="../src/gsdsrc.c">src/gsdsrc.c</a>,
|
|
|
445 |
<a href="../src/gsdsrc.h">src/gsdsrc.h</a>,
|
|
|
446 |
<a href="../src/scommon.h">src/scommon.h</a>,
|
|
|
447 |
<a href="../src/sfxboth.c">src/sfxboth.c</a>,
|
|
|
448 |
<a href="../src/sfxfd.c">src/sfxfd.c</a>,
|
|
|
449 |
<a href="../src/sfxstdio.c">src/sfxstdio.c</a>,
|
|
|
450 |
<a href="../src/stream.h">src/stream.h</a>,
|
|
|
451 |
<a href="../src/stream.c">src/stream.c</a>,
|
|
|
452 |
<a href="../src/strimpl.h">src/strimpl.h</a>.
|
|
|
453 |
|
|
|
454 |
<dt>
|
|
|
455 |
Standard filters:
|
|
|
456 |
<dd>
|
|
|
457 |
|
|
|
458 |
<dl>
|
|
|
459 |
|
|
|
460 |
<dt>
|
|
|
461 |
CCITTFax:
|
|
|
462 |
<dd>
|
|
|
463 |
<a href="../src/scf.h">src/scf.h</a>,
|
|
|
464 |
<a href="../src/scfd.c">src/scfd.c</a>,
|
|
|
465 |
<a href="../src/scfdgen.c">src/scfdgen.c</a>,
|
|
|
466 |
<a href="../src/scfdtab.c">src/scfdtab.c</a>,
|
|
|
467 |
<a href="../src/scfe.c">src/scfe.c</a>,
|
|
|
468 |
<a href="../src/scfetab.c">src/scfetab.c</a>,
|
|
|
469 |
<a href="../src/scfparam.c">src/scfparam.c</a>,
|
|
|
470 |
<a href="../src/scfx.h">src/scfx.h</a>.
|
|
|
471 |
|
|
|
472 |
<dt>
|
|
|
473 |
DCT (JPEG):
|
|
|
474 |
<dd>
|
|
|
475 |
<a href="../src/gsjconf.h">src/gsjconf.h</a>,
|
|
|
476 |
<a href="../src/gsjmorec.h">src/gsjmorec.h</a>,
|
|
|
477 |
<a href="../src/sdcparam.c">src/sdcparam.c</a>,
|
|
|
478 |
<a href="../src/sdcparam.h">src/sdcparam.h</a>,
|
|
|
479 |
<a href="../src/sdct.h">src/sdct.h</a>,
|
|
|
480 |
<a href="../src/sdctc.c">src/sdctc.c</a>,
|
|
|
481 |
<a href="../src/sdctd.c">src/sdctd.c</a>,
|
|
|
482 |
<a href="../src/sdcte.c">src/sdcte.c</a>,
|
|
|
483 |
<a href="../src/sddparam.c">src/sddparam.c</a>,
|
|
|
484 |
<a href="../src/sdeparam.c">src/sdeparam.c</a>,
|
|
|
485 |
<a href="../src/sjpeg.h">src/sjpeg.h</a>,
|
|
|
486 |
<a href="../src/sjpegc.c">src/sjpegc.c</a>,
|
|
|
487 |
<a href="../src/sjpegd.c">src/sjpegd.c</a>,
|
|
|
488 |
<a href="../src/sjpege.c">src/sjpege.c</a>.
|
|
|
489 |
|
|
|
490 |
<dt>
|
|
|
491 |
JBIG2:
|
|
|
492 |
<a href="../src/sjbig2.h">src/sjbig2.h</a>,
|
|
|
493 |
<a href="../src/sjbig2.c">src/sjbig2.c</a>.
|
|
|
494 |
|
|
|
495 |
<dt>
|
|
|
496 |
JPX (JPEG 2000):
|
|
|
497 |
<a href="../src/sjpx.h">src/sjpx.h</a>,
|
|
|
498 |
<a href="../src/sjpx.c">src/sjpx.c</a>.
|
|
|
499 |
<dt>
|
|
|
500 |
Other compression/decompression:
|
|
|
501 |
<dd>
|
|
|
502 |
<a href="../src/slzwc.c">src/slzwc.c</a>,
|
|
|
503 |
<a href="../src/slzwd.c">src/slzwd.c</a>,
|
|
|
504 |
<a href="../src/slzwe.c">src/slzwe.c</a>,
|
|
|
505 |
<a href="../src/slzwx.h">src/slzwx.h</a>,
|
|
|
506 |
<a href="../src/srld.c">src/srld.c</a>,
|
|
|
507 |
<a href="../src/srle.c">src/srle.c</a>,
|
|
|
508 |
<a href="../src/srlx.h">src/srlx.h</a>.
|
|
|
509 |
|
|
|
510 |
<dt>
|
|
|
511 |
Other:
|
|
|
512 |
<dd>
|
|
|
513 |
<a href="../src/sa85d.c">src/sa85d.c</a>,
|
|
|
514 |
<a href="../src/sa85d.h">src/sa85d.h</a>,
|
|
|
515 |
<a href="../src/sa85x.h">src/sa85x.h</a>,
|
|
|
516 |
<a href="../src/sfilter1.c">src/sfilter1.c</a>,
|
|
|
517 |
<a href="../src/sfilter2.c">src/sfilter2.c</a>,
|
|
|
518 |
<a href="../src/sstring.c">src/sstring.c</a>,
|
|
|
519 |
<a href="../src/sstring.h">src/sstring.h</a>.
|
|
|
520 |
|
|
|
521 |
</dl>
|
|
|
522 |
|
|
|
523 |
<dt>
|
|
|
524 |
Non-standard filters used to implement standard filters:
|
|
|
525 |
<dd>
|
|
|
526 |
<a href="../src/seexec.c">src/seexec.c</a>,
|
|
|
527 |
<a href="../src/sfilter.h">src/sfilter.h</a>,
|
|
|
528 |
<a href="../src/shc.c">src/shc.c</a>,
|
|
|
529 |
<a href="../src/shc.h">src/shc.h</a>,
|
|
|
530 |
<a href="../src/shcgen.c">src/shcgen.c</a>,
|
|
|
531 |
<a href="../src/shcgen.h">src/shcgen.h</a>,
|
|
|
532 |
<a href="../src/spdiff.c">src/spdiff.c</a>,
|
|
|
533 |
<a href="../src/spdiffx.h">src/spdiffx.h</a>,
|
|
|
534 |
<a href="../src/spngp.c">src/spngp.c</a>,
|
|
|
535 |
<a href="../src/spngpx.h">src/spngpx.h</a>,
|
|
|
536 |
<a href="../src/szlibc.c">src/szlibc.c</a>,
|
|
|
537 |
<a href="../src/szlibd.c">src/szlibd.c</a>,
|
|
|
538 |
<a href="../src/szlibe.c">src/szlibe.c</a>,
|
|
|
539 |
<a href="../src/szlibx.h">src/szlibx.h</a>,
|
|
|
540 |
<a href="../src/szlibxx.h">src/szlibxx.h</a>.
|
|
|
541 |
|
|
|
542 |
<dt>
|
|
|
543 |
Non-standard filters:
|
|
|
544 |
<dd>
|
|
|
545 |
<a href="../src/sbcp.c">src/sbcp.c</a>,
|
|
|
546 |
<a href="../src/sbcp.h">src/sbcp.h</a>,
|
|
|
547 |
<a href="../src/sbhc.c">src/sbhc.c</a>,
|
|
|
548 |
<a href="../src/sbhc.h">src/sbhc.h</a>,
|
|
|
549 |
<a href="../src/sbtx.h">src/sbtx.h</a>,
|
|
|
550 |
<a href="../src/sbwbs.c">src/sbwbs.c</a>,
|
|
|
551 |
<a href="../src/sbwbs.h">src/sbwbs.h</a>,
|
|
|
552 |
<a href="../src/smd5.c">src/smd5.c</a>,
|
|
|
553 |
<a href="../src/smd5.h">src/smd5.h</a>,
|
|
|
554 |
<a href="../src/sarc4.c">src/sarc4.c</a>,
|
|
|
555 |
<a href="../src/sarc4.h">src/sarc4.h</a>,
|
|
|
556 |
<a href="../src/smtf.c">src/smtf.c</a>,
|
|
|
557 |
<a href="../src/smtf.h">src/smtf.h</a>.
|
|
|
558 |
|
|
|
559 |
<dt>
|
|
|
560 |
Internal filters:
|
|
|
561 |
<dd>
|
|
|
562 |
a<a href="../src/siinterp.c">src/siinterp.c</a>,
|
|
|
563 |
<a href="../src/siinterp.h">src/siinterp.h</a>,
|
|
|
564 |
<a href="../src/siscale.c">src/siscale.c</a>,
|
|
|
565 |
<a href="../src/siscale.h">src/siscale.h</a>,
|
|
|
566 |
<a href="../src/sisparam.h">src/sisparam.h</a>.
|
|
|
567 |
|
|
|
568 |
<dt>
|
|
|
569 |
Higher-level stream support:
|
|
|
570 |
<dd>
|
|
|
571 |
<a href="../src/spprint.c">src/spprint.c</a>,
|
|
|
572 |
<a href="../src/spprint.h">src/spprint.h</a>,
|
|
|
573 |
<a href="../src/spsdf.c">src/spsdf.c</a>,
|
|
|
574 |
<a href="../src/spsdf.h">src/spsdf.h</a>,
|
|
|
575 |
<a href="../src/srdline.h">src/srdline.h</a>.
|
|
|
576 |
|
|
|
577 |
</dl>
|
|
|
578 |
|
|
|
579 |
<h4>Platform-specific code</h4>
|
|
|
580 |
|
|
|
581 |
See <a href="#Cross_platform_APIs">below</a>.
|
|
|
582 |
|
|
|
583 |
<h4>Miscellaneous</h4>
|
|
|
584 |
|
|
|
585 |
<dl>
|
|
|
586 |
|
|
|
587 |
<dt>
|
|
|
588 |
Library top level:
|
|
|
589 |
<dd>
|
|
|
590 |
<a href="../src/gsinit.c">src/gsinit.c</a>,
|
|
|
591 |
<a href="../src/gslib.h">src/gslib.h</a>.
|
|
|
592 |
|
|
|
593 |
<dt>
|
|
|
594 |
Configuration-related:
|
|
|
595 |
<dd>
|
|
|
596 |
<a href="../src/gconf.c">src/gconf.c</a>,
|
|
|
597 |
<a href="../src/gconf.h">src/gconf.h</a>,
|
|
|
598 |
<a href="../src/gscdef.c">src/gscdef.c</a>,
|
|
|
599 |
<a href="../src/gscdefs.h">src/gscdefs.h</a>.
|
|
|
600 |
|
|
|
601 |
<dt>
|
|
|
602 |
Arithmetic:
|
|
|
603 |
<dd>
|
|
|
604 |
<a href="../src/gsfemu.c">src/gsfemu.c</a>,
|
|
|
605 |
<a href="../src/gxarith.h">src/gxarith.h</a>,
|
|
|
606 |
<a href="../src/gxdda.h">src/gxdda.h</a>,
|
|
|
607 |
<a href="../src/gxfarith.h">src/gxfarith.h</a>,
|
|
|
608 |
<a href="../src/gxfixed.h">src/gxfixed.h</a>,
|
|
|
609 |
<a href="../src/gxfrac.h">src/gxfrac.h</a>.
|
|
|
610 |
|
|
|
611 |
<dt>
|
|
|
612 |
Operating system interface:
|
|
|
613 |
<dd>
|
|
|
614 |
<a href="../src/gserror.h">src/gserror.h</a>,
|
|
|
615 |
<a href="../src/gsexit.h">src/gsexit.h</a>,
|
|
|
616 |
<a href="../src/gxstdio.h">src/gxstdio.h</a>,
|
|
|
617 |
<a href="../src/gxsync.c">src/gxsync.c</a>,
|
|
|
618 |
<a href="../src/gxsync.h">src/gxsync.h</a>.
|
|
|
619 |
|
|
|
620 |
<dt>
|
|
|
621 |
Other:
|
|
|
622 |
<dd>
|
|
|
623 |
<a href="../src/gsargs.c">src/gsargs.c</a>,
|
|
|
624 |
<a href="../src/gsargs.h">src/gsargs.h</a>,
|
|
|
625 |
<a href="../src/gserrors.h">src/gserrors.h</a>,
|
|
|
626 |
<a href="../src/gsnotify.c">src/gsnotify.c</a>,
|
|
|
627 |
<a href="../src/gsnotify.h">src/gsnotify.h</a>,
|
|
|
628 |
<a href="../src/gsrect.h">src/gsrect.h</a>,
|
|
|
629 |
<a href="../src/gstypes.h">src/gstypes.h</a>,
|
|
|
630 |
<a href="../src/gsuid.h">src/gsuid.h</a>,
|
|
|
631 |
<a href="../src/gsutil.h">src/gsutil.h</a>,
|
|
|
632 |
<a href="../src/gsutil.c">src/gsutil.c</a>,
|
|
|
633 |
<a href="../src/gx.h">src/gx.h</a>,
|
|
|
634 |
<a href="../src/md5.c">src/md5.c</a>,
|
|
|
635 |
<a href="../src/md5.h">src/md5.h</a>,
|
|
|
636 |
<a href="../src/md5main.c">src/md5main.c</a>.
|
|
|
637 |
|
|
|
638 |
</dl>
|
|
|
639 |
|
|
|
640 |
<h3><a name="Graphics_library"></a>Graphics library</h3>
|
|
|
641 |
|
|
|
642 |
<h4><a name="Library_support"></a>Support</h4>
|
|
|
643 |
|
|
|
644 |
<dl>
|
|
|
645 |
|
|
|
646 |
<dt>
|
|
|
647 |
Bitmap processing:
|
|
|
648 |
<dd>
|
|
|
649 |
<a href="../src/gsbitcom.c">src/gsbitcom.c</a>,
|
|
|
650 |
<a href="../src/gsbitmap.h">src/gsbitmap.h</a>,
|
|
|
651 |
<a href="../src/gsbitops.c">src/gsbitops.c</a>,
|
|
|
652 |
<a href="../src/gsbitops.h">src/gsbitops.h</a>,
|
|
|
653 |
<a href="../src/gsbittab.c">src/gsbittab.c</a>,
|
|
|
654 |
<a href="../src/gsbittab.h">src/gsbittab.h</a>,
|
|
|
655 |
<a href="../src/gsflip.c">src/gsflip.c</a>,
|
|
|
656 |
<a href="../src/gsflip.h">src/gsflip.h</a>,
|
|
|
657 |
<a href="../src/gxbitmap.h">src/gxbitmap.h</a>,
|
|
|
658 |
<a href="../src/gxbitops.h">src/gxbitops.h</a>,
|
|
|
659 |
<a href="../src/gxsample.c">src/gxsample.c</a>,
|
|
|
660 |
<a href="../src/gxsample.h">src/gxsample.h</a>.
|
|
|
661 |
<a href="../src/gxsamplp.h">src/gxsamplp.h</a>.
|
|
|
662 |
|
|
|
663 |
<dt>
|
|
|
664 |
Functions:
|
|
|
665 |
<dd>
|
|
|
666 |
<a href="../src/gsfunc.c">src/gsfunc.c</a>,
|
|
|
667 |
<a href="../src/gsfunc.h">src/gsfunc.h</a>,
|
|
|
668 |
<a href="../src/gsfunc0.c">src/gsfunc0.c</a>,
|
|
|
669 |
<a href="../src/gsfunc0.h">src/gsfunc0.h</a>,
|
|
|
670 |
<a href="../src/gsfunc3.c">src/gsfunc3.c</a>,
|
|
|
671 |
<a href="../src/gsfunc3.h">src/gsfunc3.h</a>,
|
|
|
672 |
<a href="../src/gsfunc4.c">src/gsfunc4.c</a>,
|
|
|
673 |
<a href="../src/gsfunc4.h">src/gsfunc4.h</a>,
|
|
|
674 |
<a href="../src/gxfunc.h">src/gxfunc.h</a>.
|
|
|
675 |
|
|
|
676 |
<dt>
|
|
|
677 |
Parameter lists:
|
|
|
678 |
<dd>
|
|
|
679 |
<a href="../src/gscparam.c">src/gscparam.c</a>,
|
|
|
680 |
<a href="../src/gsparam.c">src/gsparam.c</a>,
|
|
|
681 |
<a href="../src/gsparam.h">src/gsparam.h</a>,
|
|
|
682 |
<a href="../src/gsparam2.c">src/gsparam2.c</a> (not used),
|
|
|
683 |
<a href="../src/gsparams.c">src/gsparams.c</a>,
|
|
|
684 |
<a href="../src/gsparams.h">src/gsparams.h</a>,
|
|
|
685 |
<a href="../src/gsparamx.c">src/gsparamx.c</a>,
|
|
|
686 |
<a href="../src/gsparamx.h">src/gsparamx.h</a>.
|
|
|
687 |
|
|
|
688 |
<dt>
|
|
|
689 |
I/O-related:
|
|
|
690 |
<dd>
|
|
|
691 |
<a href="../src/gdevpipe.c">src/gdevpipe.c</a>,
|
|
|
692 |
<a href="../src/gsfname.c">src/gsfname.c</a>,
|
|
|
693 |
<a href="../src/gsfname.h">src/gsfname.h</a>,
|
|
|
694 |
<a href="../src/gsio.h">src/gsio.h</a>,
|
|
|
695 |
<a href="../src/gsiodev.c">src/gsiodev.c</a>,
|
|
|
696 |
<a href="../src/gsiodevs.c">src/gsiodevs.c</a>,
|
|
|
697 |
<a href="../src/gsiodisk.c">src/gsiodisk.c</a>,
|
|
|
698 |
<a href="../src/gsiorom.c">src/gsiorom.c</a>.
|
|
|
699 |
<a href="../src/gxiodev.h">src/gxiodev.h</a>.
|
|
|
700 |
|
|
|
701 |
</dl>
|
|
|
702 |
|
|
|
703 |
<h4><a name="Paths"></a>Paths</h4>
|
|
|
704 |
|
|
|
705 |
<dl>
|
|
|
706 |
|
|
|
707 |
<dt>
|
|
|
708 |
Coordinate transformation:
|
|
|
709 |
<dd>
|
|
|
710 |
<a href="../src/gscoord.c">src/gscoord.c</a>,
|
|
|
711 |
<a href="../src/gscoord.h">src/gscoord.h</a>,
|
|
|
712 |
<a href="../src/gsmatrix.c">src/gsmatrix.c</a>,
|
|
|
713 |
<a href="../src/gsmatrix.h">src/gsmatrix.h</a>,
|
|
|
714 |
<a href="../src/gxcoord.h">src/gxcoord.h</a>,
|
|
|
715 |
<a href="../src/gxmatrix.h">src/gxmatrix.h</a>.
|
|
|
716 |
|
|
|
717 |
<dt>
|
|
|
718 |
Path building:
|
|
|
719 |
<dd>
|
|
|
720 |
<a href="../src/gsdps1.c">src/gsdps1.c</a>,
|
|
|
721 |
<a href="../src/gspath.c">src/gspath.c</a>,
|
|
|
722 |
<a href="../src/gspath.h">src/gspath.h</a>,
|
|
|
723 |
<a href="../src/gspath1.c">src/gspath1.c</a>,
|
|
|
724 |
<a href="../src/gspath2.h">src/gspath2.h</a>,
|
|
|
725 |
<a href="../src/gxpath.c">src/gxpath.c</a>,
|
|
|
726 |
<a href="../src/gxpath.h">src/gxpath.h</a>,
|
|
|
727 |
<a href="../src/gxpath2.c">src/gxpath2.c</a>,
|
|
|
728 |
<a href="../src/gxpcopy.c">src/gxpcopy.c</a>,
|
|
|
729 |
<a href="../src/gxpdash.c">src/gxpdash.c</a>,
|
|
|
730 |
<a href="../src/gxpflat.c">src/gxpflat.c</a>,
|
|
|
731 |
<a href="../src/gzpath.h">src/gzpath.h</a>.
|
|
|
732 |
|
|
|
733 |
<dt>
|
|
|
734 |
Path rendering:
|
|
|
735 |
<dd>
|
|
|
736 |
<a href="../src/gdevddrw.c">src/gdevddrw.c</a>,
|
|
|
737 |
<a href="../src/gdevddrw.h">src/gdevddrw.h</a>,
|
|
|
738 |
<a href="../src/gxdtfill.h">src/gxdtfill.h</a>,
|
|
|
739 |
<a href="../src/gsdps1.c">src/gsdps1.c</a>,
|
|
|
740 |
<a href="../src/gspaint.c">src/gspaint.c</a>,
|
|
|
741 |
<a href="../src/gspaint.h">src/gspaint.h</a>,
|
|
|
742 |
<a href="../src/gspenum.h">src/gspenum.h</a>,
|
|
|
743 |
<a href="../src/gxfill.c">src/gxfill.c</a>,
|
|
|
744 |
<a href="../src/gxfill.h">src/gxfill.h</a>,
|
|
|
745 |
<a href="../src/gxfillsl.h">src/gxfills1.h</a>,
|
|
|
746 |
<a href="../src/gxfilltr.h">src/gxfilltr.h</a>,
|
|
|
747 |
<a href="../src/gxfillts.h">src/gxfillts.h</a>,
|
|
|
748 |
<a href="../src/gxfdrop.c">src/gxdrop.c</a>,
|
|
|
749 |
<a href="../src/gxfdrop.h">src/gxdrop.h</a>,
|
|
|
750 |
<a href="../src/gxpaint.c">src/gxpaint.c</a>,
|
|
|
751 |
<a href="../src/gxpaint.h">src/gxpaint.h</a>,
|
|
|
752 |
<a href="../src/gxstroke.c">src/gxstroke.c</a>,
|
|
|
753 |
<a href="../src/gzspotan.c">src/gzspotan.c</a>,
|
|
|
754 |
<a href="../src/gzspotan.h">src/gzspotan.h</a>.
|
|
|
755 |
|
|
|
756 |
<dt>
|
|
|
757 |
Clipping:
|
|
|
758 |
<dd>
|
|
|
759 |
See under <a href="#Clipping">Clipping</a> below.
|
|
|
760 |
|
|
|
761 |
</dl>
|
|
|
762 |
|
|
|
763 |
<h4><a name="Text"></a>Text</h4>
|
|
|
764 |
|
|
|
765 |
<dl>
|
|
|
766 |
|
|
|
767 |
<dt>
|
|
|
768 |
Fonts, generic:
|
|
|
769 |
<dd>
|
|
|
770 |
<a href="../src/gsfont.c">src/gsfont.c</a>,
|
|
|
771 |
<a href="../src/gsfont.h">src/gsfont.h</a>,
|
|
|
772 |
<a href="../src/gxfcopy.c">src/gxfcopy.c</a>,
|
|
|
773 |
<a href="../src/gxfcopy.h">src/gxfcopy.h</a>,
|
|
|
774 |
<a href="../src/gxfont.h">src/gxfont.h</a>.
|
|
|
775 |
|
|
|
776 |
<dt>
|
|
|
777 |
Fonts, specific FontTypes:
|
|
|
778 |
<dd>
|
|
|
779 |
<a href="../src/gsfcid.c">src/gsfcid.c</a>,
|
|
|
780 |
<a href="../src/gsfcid2.c">src/gsfcid.c</a>,
|
|
|
781 |
<a href="../src/gsfcmap.c">src/gsfcmap.c</a>,
|
|
|
782 |
<a href="../src/gsfcmap1.c">src/gsfcmap1.c</a>,
|
|
|
783 |
<a href="../src/gsfcmap.h">src/gsfcmap.h</a>,
|
|
|
784 |
<a href="../src/gsfont0.c">src/gsfont0.c</a>,
|
|
|
785 |
<a href="../src/gsfont0c.c">src/gsfont0.c</a>,
|
|
|
786 |
<a href="../src/gxcid.h">src/gxcid.h</a>,
|
|
|
787 |
<a href="../src/gxfcid.h">src/gxfcid.h</a>,
|
|
|
788 |
<a href="../src/gxfcmap.h">src/gxfcmap.h</a>,
|
|
|
789 |
<a href="../src/gxfcmap1.h">src/gxfcmap1.h</a>,
|
|
|
790 |
<a href="../src/gxfont0.h">src/gxfont0.h</a>,
|
|
|
791 |
<a href="../src/gxfont0c.h">src/gxfont0c.h</a>,
|
|
|
792 |
<a href="../src/gxfont1.h">src/gxfont1.h</a>,
|
|
|
793 |
<a href="../src/gxfont42.h">src/gxfont42.h</a>,
|
|
|
794 |
<a href="../src/gxftype.h">src/gxftype.h</a>,
|
|
|
795 |
<a href="../src/gxttf.h">src/gxttf.h</a>.
|
|
|
796 |
|
|
|
797 |
<dt>
|
|
|
798 |
Character rendering + font cache, generic:
|
|
|
799 |
<dd>
|
|
|
800 |
<a href="../src/gsccode.h">src/gsccode.h</a>,
|
|
|
801 |
<a href="../src/gschar.c">src/gschar.c</a>,
|
|
|
802 |
<a href="../src/gschar.h">src/gschar.h</a>,
|
|
|
803 |
<a href="../src/gscpm.h">src/gscpm.h</a>,
|
|
|
804 |
<a href="../src/gsgdata.c">src/gsgdata.c</a>,
|
|
|
805 |
<a href="../src/gsgdata.h">src/gsgdata.h</a>,
|
|
|
806 |
<a href="../src/gsgcache.c">src/gsgcache.c</a>,
|
|
|
807 |
<a href="../src/gsgcache.h">src/gsgcache.h</a>,
|
|
|
808 |
<a href="../src/gstext.c">src/gstext.c</a>,
|
|
|
809 |
<a href="../src/gstext.h">src/gstext.h</a>,
|
|
|
810 |
<a href="../src/gxbcache.c">src/gxbcache.c</a>,
|
|
|
811 |
<a href="../src/gxbcache.h">src/gxbcache.h</a>,
|
|
|
812 |
<a href="../src/gxccache.c">src/gxccache.c</a>,
|
|
|
813 |
<a href="../src/gxccman.c">src/gxccman.c</a>,
|
|
|
814 |
<a href="../src/gxchar.c">src/gxchar.c</a>,
|
|
|
815 |
<a href="../src/gxchar.h">src/gxchar.h</a>,
|
|
|
816 |
<a href="../src/gxfcache.h">src/gxfcache.h</a>,
|
|
|
817 |
<a href="../src/gxtext.h">src/gxtext.h</a>.
|
|
|
818 |
|
|
|
819 |
<dt>
|
|
|
820 |
Character rendering, specific FontTypes:
|
|
|
821 |
<dd>
|
|
|
822 |
<a href="../src/gschar0.c">src/gschar0.c</a>,
|
|
|
823 |
<a href="../src/gscrypt1.c">src/gscrypt1.c</a>,
|
|
|
824 |
<a href="../src/gscrypt1.h">src/gscrypt1.h</a>,
|
|
|
825 |
<a href="../src/gstype1.c">src/gstype1.c</a>,
|
|
|
826 |
<a href="../src/gstype1.h">src/gstype1.h</a>,
|
|
|
827 |
<a href="../src/gstype2.c">src/gstype2.c</a>,
|
|
|
828 |
<a href="../src/gstype42.c">src/gstype42.c</a>,
|
|
|
829 |
<a href="../src/gxchrout.c">src/gxchrout.c</a>,
|
|
|
830 |
<a href="../src/gxchrout.h">src/gxchrout.h</a>,
|
|
|
831 |
<a href="../src/gxhint1.c">src/gxhint1.c</a>,
|
|
|
832 |
<a href="../src/gxhint2.c">src/gxhint2.c</a>,
|
|
|
833 |
<a href="../src/gxhint3.c">src/gxhint3.c</a>,
|
|
|
834 |
<a href="../src/gxhintn.h">src/gxhintn.h</a>,
|
|
|
835 |
<a href="../src/gxhintn.c">src/gxhintn.c</a>,
|
|
|
836 |
<a href="../src/gxop1.h">src/gxop1.h</a>,
|
|
|
837 |
<a href="../src/gxtype1.c">src/gxtype1.c</a>,
|
|
|
838 |
<a href="../src/gxtype1.h">src/gxtype1.h</a>.
|
|
|
839 |
|
|
|
840 |
</dl>
|
|
|
841 |
|
|
|
842 |
<h4><a name="Images"></a>Images</h4>
|
|
|
843 |
|
|
|
844 |
<dl>
|
|
|
845 |
|
|
|
846 |
<dt>
|
|
|
847 |
Buffered API (mostly for PostScript interpreter):
|
|
|
848 |
<dd>
|
|
|
849 |
<a href="../src/gsimage.c">src/gsimage.c</a>,
|
|
|
850 |
<a href="../src/gsimage.h">src/gsimage.h</a>.
|
|
|
851 |
|
|
|
852 |
<dt>
|
|
|
853 |
Generic support:
|
|
|
854 |
<dd>
|
|
|
855 |
<a href="../src/gsiparam.h">src/gsiparam.h</a>,
|
|
|
856 |
<a href="../src/gxiclass.h">src/gxiclass.h</a>,
|
|
|
857 |
<a href="../src/gximage.c">src/gximage.c</a>,
|
|
|
858 |
<a href="../src/gximage.h">src/gximage.h</a>,
|
|
|
859 |
<a href="../src/gxiparam.h">src/gxiparam.h</a>.
|
|
|
860 |
|
|
|
861 |
<dt>
|
|
|
862 |
Type 1 and 4 images:
|
|
|
863 |
<dd>
|
|
|
864 |
|
|
|
865 |
<dl>
|
|
|
866 |
|
|
|
867 |
<dt>
|
|
|
868 |
Setup:
|
|
|
869 |
<dd>
|
|
|
870 |
<a href="../src/gsiparm4.h">src/gsiparm4.h</a>,
|
|
|
871 |
<a href="../src/gximage1.c">src/gximage1.c</a>,
|
|
|
872 |
<a href="../src/gximage4.c">src/gximage4.c</a>.
|
|
|
873 |
|
|
|
874 |
<dt>
|
|
|
875 |
Rendering:
|
|
|
876 |
<dd>
|
|
|
877 |
<a href="../src/gxi12bit.c">src/gxi12bit.c</a>,
|
|
|
878 |
<a href="../src/gxi16bit.c">src/gxi16bit.c</a>,
|
|
|
879 |
<a href="../src/gxicolor.c">src/gxicolor.c</a>,
|
|
|
880 |
<a href="../src/gxidata.c">src/gxidata.c</a>,
|
|
|
881 |
<a href="../src/gxifast.c">src/gxifast.c</a>,
|
|
|
882 |
<a href="../src/gximono.c">src/gximono.c</a>,
|
|
|
883 |
<a href="../src/gxino12b.c">src/gxino12b.c</a>,
|
|
|
884 |
<a href="../src/gxino16b.c">src/gxino16b.c</a>,
|
|
|
885 |
<a href="../src/gxipixel.c">src/gxipixel.c</a>,
|
|
|
886 |
<a href="../src/gxiscale.c">src/gxiscale.c</a>.
|
|
|
887 |
|
|
|
888 |
</dl>
|
|
|
889 |
|
|
|
890 |
<dt>
|
|
|
891 |
Type 2 images (Display PostScript):
|
|
|
892 |
<dd>
|
|
|
893 |
<a href="../src/gsiparm2.h">src/gsiparm2.h</a>,
|
|
|
894 |
<a href="../src/gximage2.c">src/gximage2.c</a>.
|
|
|
895 |
|
|
|
896 |
<dt>
|
|
|
897 |
Type 3 images:
|
|
|
898 |
<dd>
|
|
|
899 |
<a href="../src/gsipar3x.h">src/gsipar3x.h</a>,
|
|
|
900 |
<a href="../src/gsiparm3.h">src/gsiparm3.h</a>,
|
|
|
901 |
<a href="../src/gximag3x.c">src/gximag3x.c</a>,
|
|
|
902 |
<a href="../src/gximag3x.h">src/gximag3x.h</a>,
|
|
|
903 |
<a href="../src/gximage3.c">src/gximage3.c</a>,
|
|
|
904 |
<a href="../src/gximage3.h">src/gximage3.h</a>.
|
|
|
905 |
|
|
|
906 |
<dt>
|
|
|
907 |
Other:
|
|
|
908 |
<dd>
|
|
|
909 |
<a href="../src/gsimpath.c">src/gsimpath.c</a>.
|
|
|
910 |
|
|
|
911 |
</dl>
|
|
|
912 |
|
|
|
913 |
<h4><a name="Paint"></a>Paint</h4>
|
|
|
914 |
|
|
|
915 |
<p>
|
|
|
916 |
Ghostscript uses 4 internal representations of color. We list them here in
|
|
|
917 |
the order in which they occur in the rendering pipeline.
|
|
|
918 |
|
|
|
919 |
<ol>
|
|
|
920 |
|
|
|
921 |
<li>Clients of the graphics library normally specify colors using the
|
|
|
922 |
<em>client color</em> structure (<b><tt>gs_client_color</tt></b>, defined in
|
|
|
923 |
<a href="../src/gsccolor.h">src/gsccolor.h</a>), consisting of one or more
|
|
|
924 |
numeric values and/or a pointer to a Pattern instance. This corresponds
|
|
|
925 |
directly to the values that would be passed to the PostScript
|
|
|
926 |
<b><tt>setcolor</tt></b> operator: one or more (floating-point) numeric
|
|
|
927 |
components and/or a Pattern. Client colors are interpreted relative to a
|
|
|
928 |
color space (<b><tt>gs_color_space</tt></b>, defined in <a
|
|
|
929 |
href="../src/gscspace.h">src/gscspace.h</a> and <a
|
|
|
930 |
href="../src/gxcspace.h">src/gxcspace.h</a>, with specific color spaces
|
|
|
931 |
defined in other files). Client colors do not explicitly reference the
|
|
|
932 |
color space in which they are are interpreted: <b><tt>setcolor</tt></b> uses
|
|
|
933 |
the color space in the graphics state, while images and shadings explicitly
|
|
|
934 |
specify the color space to be used.
|
|
|
935 |
|
|
|
936 |
<li>For ordinary non-Pattern colors, the first step in color rendering
|
|
|
937 |
reduces a client color to a <em>concrete</em> color -- a set of values in a
|
|
|
938 |
color space that corresponds to the device's color model (except for
|
|
|
939 |
possible conversions between DeviceGray, DeviceRGB, and DeviceCMYK),
|
|
|
940 |
together with an identification of the associated color space. (The
|
|
|
941 |
confusion here between color spaces and color models will have to be cleaned
|
|
|
942 |
up when we implement native Separation/DeviceN colors.) Concrete colors are
|
|
|
943 |
like the numeric values in a client color, except that they are represented
|
|
|
944 |
by arrays of <b><tt>frac</tt></b> values (defined in <a
|
|
|
945 |
href="../src/gxfrac.h">src/gxfrac.h</a>) rather than floats. The procedure
|
|
|
946 |
for this step is the virtual <b><tt>concretize_color</tt></b> and
|
|
|
947 |
<b><tt>concrete_space</tt></b> procedures in the (original) color space.
|
|
|
948 |
This step reduces Indexed colors, CIEBased colors, and Separation and
|
|
|
949 |
DeviceN colors that use the alternate space.
|
|
|
950 |
|
|
|
951 |
<li>The final step requires mapping a concrete color to the device's color
|
|
|
952 |
model, done by procedures in <a href="../src/gxcmap.c">src/gxcmap.c</a>.
|
|
|
953 |
These procedures combine the following three conceptual sub-steps:
|
|
|
954 |
|
|
|
955 |
<ul>
|
|
|
956 |
|
|
|
957 |
<li>A possible mapping between Device color spaces, possibly involving black
|
|
|
958 |
generation and undercolor removal. The non-trivial cases are implemented in
|
|
|
959 |
<a href="../src/gxdcconv.c">src/gxdcconv.c</a>.
|
|
|
960 |
|
|
|
961 |
<li>Application of the transfer function(s) (done in-line).
|
|
|
962 |
|
|
|
963 |
<li>Halftoning if necessary: see below.
|
|
|
964 |
|
|
|
965 |
</ul>
|
|
|
966 |
|
|
|
967 |
The result is called (inappropriately) a <em>device color</em>
|
|
|
968 |
(<b><tt>gx_device_color</tt></b>, defined in <a
|
|
|
969 |
href="../src/gsdcolor.h">src/gsdcolor.h</a> and <a
|
|
|
970 |
href="../src/gxdcolor.h">src/gxdcolor.h</a>). For ordinary non-Pattern
|
|
|
971 |
colors, a device color is either a pure color, or a halftone. The device
|
|
|
972 |
and color model associated with a device color are implicit. The procedure
|
|
|
973 |
for this step is the virtual <b><tt>remap_concrete_color</tt></b> procedure
|
|
|
974 |
in the color space.
|
|
|
975 |
|
|
|
976 |
<li>The pure colors that underlie a device color are opaque <em>pixel
|
|
|
977 |
values</em> defined by the device (misnamed <b><tt>gx_color_index</tt></b>,
|
|
|
978 |
defined in <a href="../src/gscindex.h">src/gscindex.h</a>). The device with
|
|
|
979 |
which they are associated is implicit. Although the format and
|
|
|
980 |
interpretation of a pixel value are known only to the device, the device's
|
|
|
981 |
color model and color representation capabilities are public, defined by a
|
|
|
982 |
<b><tt>gx_color_info</tt></b> structure stored in the device (defined in <a
|
|
|
983 |
href="../src/gxdevcli.h">src/gxdevcli.h</a>). Virtual procedures of the
|
|
|
984 |
device driver map between pixel values and RGB or CMYK. (This area is
|
|
|
985 |
untidy and will need to be cleaned up when we implement native
|
|
|
986 |
Separation/DeviceN colors.)
|
|
|
987 |
|
|
|
988 |
</ol>
|
|
|
989 |
|
|
|
990 |
<p>
|
|
|
991 |
Steps 2 and 3 are normally combined into a single step for efficiency, as
|
|
|
992 |
the <b><tt>remap_color</tt></b> virtual procedure in a color space.
|
|
|
993 |
|
|
|
994 |
<p>
|
|
|
995 |
Using a device color to actually paint pixels requires a further step called
|
|
|
996 |
<em>color loading</em>, implemented by the <b><tt>load</tt></b> virtual
|
|
|
997 |
procedure in the device color. This does nothing for pure colors, but loads
|
|
|
998 |
the caches for halftones and Patterns.
|
|
|
999 |
|
|
|
1000 |
<p>
|
|
|
1001 |
All of the above steps -- concretizing, mapping to a device color, and color
|
|
|
1002 |
loading -- are done as late as possible, normally not until the color is
|
|
|
1003 |
actually needed for painting.
|
|
|
1004 |
|
|
|
1005 |
<p>
|
|
|
1006 |
All painting operations (fill, stroke, imagemask/show) eventually call a
|
|
|
1007 |
virtual procedure in the device color, either <b><tt>fill_rectangle</tt></b>
|
|
|
1008 |
or <b><tt>fill_mask</tt></b> to actually paint pixels. For rectangle fills,
|
|
|
1009 |
pure colors call the device's <b><tt>fill_rectangle</tt></b> procedure;
|
|
|
1010 |
halftones and tiled Patterns call the device's
|
|
|
1011 |
<b><tt>tile_rectangle</tt></b>; shaded Patterns, and painting operations
|
|
|
1012 |
that involve a RasterOp, do something more complicated.
|
|
|
1013 |
|
|
|
1014 |
<dl>
|
|
|
1015 |
|
|
|
1016 |
<dt>
|
|
|
1017 |
Color specification:
|
|
|
1018 |
<dd>
|
|
|
1019 |
<a href="../src/gsccolor.h">src/gsccolor.h</a>,
|
|
|
1020 |
<a href="../src/gscolor.c">src/gscolor.c</a>,
|
|
|
1021 |
<a href="../src/gscolor.h">src/gscolor.h</a>,
|
|
|
1022 |
<a href="../src/gscolor1.c">src/gscolor1.c</a>,
|
|
|
1023 |
<a href="../src/gscolor1.h">src/gscolor1.h</a>,
|
|
|
1024 |
<a href="../src/gscolor2.c">src/gscolor2.c</a>,
|
|
|
1025 |
<a href="../src/gscolor2.h">src/gscolor2.h</a>,
|
|
|
1026 |
<a href="../src/gscolor3.c">src/gscolor3.c</a>,
|
|
|
1027 |
<a href="../src/gscolor3.h">src/gscolor3.h</a>,
|
|
|
1028 |
<a href="../src/gshsb.c">src/gshsb.c</a>,
|
|
|
1029 |
<a href="../src/gshsb.h">src/gshsb.h</a>,
|
|
|
1030 |
<a href="../src/gxcolor2.h">src/gxcolor2.h</a>,
|
|
|
1031 |
<a href="../src/gxcvalue.h">src/gxcvalue.h</a>.
|
|
|
1032 |
|
|
|
1033 |
<dt>
|
|
|
1034 |
Color spaces:
|
|
|
1035 |
<dd>
|
|
|
1036 |
<a href="../src/gscdevn.c">src/gscdevn.c</a>,
|
|
|
1037 |
<a href="../src/gscdevn.h">src/gscdevn.h</a>,
|
|
|
1038 |
<a href="../src/gscie.c">src/gscie.c</a>,
|
|
|
1039 |
<a href="../src/gscie.h">src/gscie.h</a>,
|
|
|
1040 |
<a href="../src/gscpixel.c">src/gscpixel.c</a>,
|
|
|
1041 |
<a href="../src/gscpixel.h">src/gscpixel.h</a>,
|
|
|
1042 |
<a href="../src/gscscie.c">src/gscscie.c</a>,
|
|
|
1043 |
<a href="../src/gscsepnm.h">src/gscsepnm.h</a>,
|
|
|
1044 |
<a href="../src/gscsepr.c">src/gscsepr.c</a>,
|
|
|
1045 |
<a href="../src/gscsepr.h">src/gscsepr.h</a>,
|
|
|
1046 |
<a href="../src/gscspace.c">src/gscspace.c</a>,
|
|
|
1047 |
<a href="../src/gscspace.h">src/gscspace.h</a>,
|
|
|
1048 |
<a href="../src/gscssub.c">src/gscssub.c</a>,
|
|
|
1049 |
<a href="../src/gscssub.h">src/gscssub.h</a>,
|
|
|
1050 |
<a href="../src/gxcdevn.h">src/gxcdevn.h</a>,
|
|
|
1051 |
<a href="../src/gxcie.h">src/gxcie.h</a>,
|
|
|
1052 |
<a href="../src/gxcspace.h">src/gxcspace.h</a>.
|
|
|
1053 |
|
|
|
1054 |
<dt>
|
|
|
1055 |
Color mapping:
|
|
|
1056 |
<dd>
|
|
|
1057 |
<a href="../src/gsciemap.c">src/gsciemap.c</a>,
|
|
|
1058 |
<a href="../src/gscindex.h">src/gscindex.h</a>,
|
|
|
1059 |
<a href="../src/gscrd.c">src/gscrd.c</a>,
|
|
|
1060 |
<a href="../src/gscrd.h">src/gscrd.h</a>,
|
|
|
1061 |
<a href="../src/gscrdp.c">src/gscrdp.c</a>,
|
|
|
1062 |
<a href="../src/gscrdp.h">src/gscrdp.h</a>,
|
|
|
1063 |
<a href="../src/gscsel.h">src/gscsel.h</a>,
|
|
|
1064 |
<a href="../src/gsdcolor.h">src/gsdcolor.h</a>,
|
|
|
1065 |
<a href="../src/gxcindex.h">src/gxcindex.h</a>,
|
|
|
1066 |
<a href="../src/gxcmap.c">src/gxcmap.c</a>,
|
|
|
1067 |
<a href="../src/gxcmap.h">src/gxcmap.h</a>,
|
|
|
1068 |
<a href="../src/gxctable.c">src/gxctable.c</a>,
|
|
|
1069 |
<a href="../src/gxctable.h">src/gxctable.h</a>,
|
|
|
1070 |
<a href="../src/gxdcconv.c">src/gxdcconv.c</a>,
|
|
|
1071 |
<a href="../src/gxdcconv.h">src/gxdcconv.h</a>,
|
|
|
1072 |
<a href="../src/gxdcolor.c">src/gxdcolor.c</a>,
|
|
|
1073 |
<a href="../src/gxdcolor.h">src/gxdcolor.h</a>,
|
|
|
1074 |
<a href="../src/gxdevndi.c">src/gevndi.c</a>,
|
|
|
1075 |
<a href="../src/gxdevndi.h">src/gxdevndi.h</a>,
|
|
|
1076 |
<a href="../src/gxdither.h">src/gxdither.h</a>,
|
|
|
1077 |
<a href="../src/gxfmap.h">src/gxfmap.h</a>,
|
|
|
1078 |
<a href="../src/gxlum.h">src/gxlum.h</a>,
|
|
|
1079 |
<a href="../src/gxtmap.h">src/gxtmap.h</a>.
|
|
|
1080 |
|
|
|
1081 |
<p>
|
|
|
1082 |
ICC profiles are in some ways a special case of color mapping, but are
|
|
|
1083 |
not standard in PostScript.
|
|
|
1084 |
|
|
|
1085 |
<dt>
|
|
|
1086 |
Color mapping:
|
|
|
1087 |
<dd>
|
|
|
1088 |
<a href="../src/gsicc.c">src/gsicc.c</a>,
|
|
|
1089 |
<a href="../src/gsicc.h">src/gsicc.h</a>,
|
|
|
1090 |
|
|
|
1091 |
</dl>
|
|
|
1092 |
|
|
|
1093 |
<p>
|
|
|
1094 |
Ghostscript represents halftones internally by "whitening orders" --
|
|
|
1095 |
essentially, arrays of arrays of bit coordinates within a halftone cell,
|
|
|
1096 |
specifying which bits are inverted to get from halftone level K to level
|
|
|
1097 |
K+1. The code does support all of the PostScript halftone types, but they
|
|
|
1098 |
are all ultimately reduced to whitening orders.
|
|
|
1099 |
|
|
|
1100 |
<p>
|
|
|
1101 |
Threshold arrays, the more conventional representation of halftones, can be
|
|
|
1102 |
mapped to whitening orders straightforwardly; however, whitening orders can
|
|
|
1103 |
represent non-monotonic halftones (halftones where the bits turned on for
|
|
|
1104 |
level K+1 don't necessarily include all the bits turned on for level K),
|
|
|
1105 |
while threshold arrays cannot. On the other hand, threshold arrays allow
|
|
|
1106 |
rapid conversion of images (using a threshold comparison for each pixel)
|
|
|
1107 |
with no additional space, while whitening orders do not: they require
|
|
|
1108 |
storing the rendered halftone cell for each possible level as a bitmap.
|
|
|
1109 |
|
|
|
1110 |
<p>
|
|
|
1111 |
Ghostscript uses two distinct types of rendered halftones -- that is, the
|
|
|
1112 |
bitmap(s) that represent a particular level.
|
|
|
1113 |
|
|
|
1114 |
<ul>
|
|
|
1115 |
|
|
|
1116 |
<li>Binary halftones. The rendered halftone is a single bit plane; each bit
|
|
|
1117 |
selects one of two pure colors. These are fast but limited: they are used
|
|
|
1118 |
for monochrome output devices, or for color devices in those cases where
|
|
|
1119 |
only two distinct colors are involved in a halftone (e.g., a pure cyan shade
|
|
|
1120 |
on a CMYK device). The device color for a binary halftone stores a pointer
|
|
|
1121 |
to the halftone bitmap, and the two pure colors.
|
|
|
1122 |
|
|
|
1123 |
<li>Multi-plane halftones. Internally, each plane is rendered individually.
|
|
|
1124 |
Since there isn't enough room to store all 2^N pure colors, multi-plane
|
|
|
1125 |
halftones only store the scaled values for the individual components; the
|
|
|
1126 |
halftone renderer maps these to the pure colors on the fly, then combines
|
|
|
1127 |
the planes to assemble an N-bit index into the list of colors for each
|
|
|
1128 |
pixel, and stores the color into the fully rendered halftone.
|
|
|
1129 |
|
|
|
1130 |
</ul>
|
|
|
1131 |
|
|
|
1132 |
<p>
|
|
|
1133 |
The halftone level for rendering a color is computed in <a
|
|
|
1134 |
href="../src/gxdevndi.c">src/gxdevndi.c</a>; the actual halftone mask or
|
|
|
1135 |
tile is computed either in <a href="../src/gxcht.c">src/gxcht.c</a> (for
|
|
|
1136 |
multi-plane halftones), or in <a href="../src/gxht.c">src/gxht.c</a> and <a
|
|
|
1137 |
href="../src/gxhtbit.c">src/gxhtbit.c</a> (for binary halftones).
|
|
|
1138 |
|
|
|
1139 |
<dl>
|
|
|
1140 |
|
|
|
1141 |
<dt>
|
|
|
1142 |
Halftoning:
|
|
|
1143 |
<dd>
|
|
|
1144 |
<a href="../src/gsht.c">src/gsht.c</a>,
|
|
|
1145 |
<a href="../src/gsht.h">src/gsht.h</a>,
|
|
|
1146 |
<a href="../src/gsht1.c">src/gsht1.c</a>,
|
|
|
1147 |
<a href="../src/gsht1.h">src/gsht1.h</a>,
|
|
|
1148 |
<a href="../src/gshtscr.c">src/gshtscr.c</a>,
|
|
|
1149 |
<a href="../src/gshtx.c">src/gshtx.c</a>,
|
|
|
1150 |
<a href="../src/gshtx.h">src/gshtx.h</a>,
|
|
|
1151 |
<a href="../src/gxcht.c">src/gxcht.c</a>,
|
|
|
1152 |
<a href="../src/gxdht.h">src/gxdht.h</a>,
|
|
|
1153 |
<a href="../src/gxdhtres.h">src/gxdhtres.h</a>,
|
|
|
1154 |
<a href="../src/gxht.c">src/gxht.c</a>,
|
|
|
1155 |
<a href="../src/gxht.h">src/gxht.h</a>,
|
|
|
1156 |
<a href="../src/gxhtbit.c">src/gxhtbit.c</a>,
|
|
|
1157 |
<a href="../src/gxhttile.h">src/gxhttile.h</a>,
|
|
|
1158 |
<a href="../src/gxhttype.h">src/gxhttype.h</a>,
|
|
|
1159 |
<a href="../src/gzht.h">src/gzht.h</a>.
|
|
|
1160 |
|
|
|
1161 |
<dt>
|
|
|
1162 |
Well tempered screening:
|
|
|
1163 |
<dd>
|
|
|
1164 |
<a href="../src/gswts.h">src/gswts.h</a>,
|
|
|
1165 |
<a href="../src/gswts.c">src/gswts.c</a>,
|
|
|
1166 |
<a href="../src/gxwts.h">src/gxwts.h</a>,
|
|
|
1167 |
<a href="../src/gxwts.c">src/gxwts.c</a>.
|
|
|
1168 |
|
|
|
1169 |
</dl>
|
|
|
1170 |
|
|
|
1171 |
<p>
|
|
|
1172 |
Pattern colors (tiled patterns and shadings) each use a slightly different
|
|
|
1173 |
approach from solid colors.
|
|
|
1174 |
|
|
|
1175 |
<p>
|
|
|
1176 |
The device color for a tiled (PatternType 1) pattern contains a pointer to a
|
|
|
1177 |
pattern instance, plus (for uncolored patterns) the device color to be
|
|
|
1178 |
masked. The pattern instance includes a procedure that actually paints the
|
|
|
1179 |
pattern if the pattern is not in the cache. For the PostScript interpreter,
|
|
|
1180 |
this procedure returns an <b><tt>e_RemapColor</tt></b> exception code: this
|
|
|
1181 |
eventually causes the interpreter to run the pattern's PaintProc, loading
|
|
|
1182 |
the rendering into the cache, and then re-execute the original drawing
|
|
|
1183 |
operator.
|
|
|
1184 |
|
|
|
1185 |
<dl>
|
|
|
1186 |
|
|
|
1187 |
<dt>
|
|
|
1188 |
Patterns:
|
|
|
1189 |
<dd>
|
|
|
1190 |
<a href="../src/gspcolor.c">src/gspcolor.c</a>,
|
|
|
1191 |
<a href="../src/gspcolor.h">src/gspcolor.h</a>,
|
|
|
1192 |
<a href="../src/gsptype1.c">src/gsptype1.c</a>,
|
|
|
1193 |
<a href="../src/gsptype1.h">src/gsptype1.h</a>,
|
|
|
1194 |
<a href="../src/gxp1fill.c">src/gxp1fill.c</a>,
|
|
|
1195 |
<a href="../src/gxp1impl.h">src/gxp1impl.h</a>,
|
|
|
1196 |
<a href="../src/gxpcache.h">src/gxpcache.h</a>,
|
|
|
1197 |
<a href="../src/gxpcmap.c">src/gxpcmap.c</a>,
|
|
|
1198 |
<a href="../src/gxpcolor.h">src/gxpcolor.h</a>.
|
|
|
1199 |
|
|
|
1200 |
</dl>
|
|
|
1201 |
|
|
|
1202 |
<p>
|
|
|
1203 |
The device color for a shading (PatternType 2) pattern also contains a
|
|
|
1204 |
pointer to a pattern instance. Shadings are not cached: painting with a
|
|
|
1205 |
shading runs the shading algorithm every time.
|
|
|
1206 |
|
|
|
1207 |
<dl>
|
|
|
1208 |
|
|
|
1209 |
<dt>
|
|
|
1210 |
Shading:
|
|
|
1211 |
<dd>
|
|
|
1212 |
<a href="../src/gsptype2.c">src/gsptype2.c</a>,
|
|
|
1213 |
<a href="../src/gsptype2.h">src/gsptype2.h</a>,
|
|
|
1214 |
<a href="../src/gsshade.c">src/gsshade.c</a>,
|
|
|
1215 |
<a href="../src/gsshade.h">src/gsshade.h</a>,
|
|
|
1216 |
<a href="../src/gxshade.c">src/gxshade.c</a>,
|
|
|
1217 |
<a href="../src/gxshade.h">src/gxshade.h</a>,
|
|
|
1218 |
<a href="../src/gxshade1.c">src/gxshade1.c</a>,
|
|
|
1219 |
<a href="../src/gxshade4.c">src/gxshade4.c</a>,
|
|
|
1220 |
<a href="../src/gxshade4.h">src/gxshade4.h</a>,
|
|
|
1221 |
<a href="../src/gxshade6.c">src/gxshade6.c</a>.
|
|
|
1222 |
|
|
|
1223 |
</dl>
|
|
|
1224 |
|
|
|
1225 |
<p> In addition to the PostScript graphics model, Ghostscript supports RasterOp,
|
|
|
1226 |
a weak form of alpha channel, and eventually the full PDF 1.4 transparency model.
|
|
|
1227 |
The implemention of these facilities is quite slipshod and scattered: only RasterOp
|
|
|
1228 |
is really implemented fully. There is a general compositing architecture, but
|
|
|
1229 |
it is hardly used at all, and in particular is not used for RasterOp. It is
|
|
|
1230 |
used for implementation of the general support for overprint and overprint mode.
|
|
|
1231 |
<dl>
|
|
|
1232 |
|
|
|
1233 |
<dt>
|
|
|
1234 |
Compositing architecture:
|
|
|
1235 |
<dd>
|
|
|
1236 |
<a href="../src/gscompt.h">src/gscompt.h</a>,
|
|
|
1237 |
<a href="../src/gxcomp.h">src/gxcomp.h</a>.
|
|
|
1238 |
|
|
|
1239 |
<dt>
|
|
|
1240 |
RasterOp:
|
|
|
1241 |
<dd>
|
|
|
1242 |
<a href="../src/gdevdrop.c">src/gdevdrop.c</a>,
|
|
|
1243 |
<a href="../src/gdevrops.c">src/gdevrops.c</a>,
|
|
|
1244 |
<a href="../src/gsnorop.c">src/gsnorop.c</a>,
|
|
|
1245 |
<a href="../src/gsrop.c">src/gsrop.c</a>,
|
|
|
1246 |
<a href="../src/gsrop.h">src/gsrop.h</a>,
|
|
|
1247 |
<a href="../src/gsropc.c">src/gsropc.c</a>,
|
|
|
1248 |
<a href="../src/gsropc.h">src/gsropc.h</a>,
|
|
|
1249 |
<a href="../src/gsropt.h">src/gsropt.h</a>,
|
|
|
1250 |
<a href="../src/gsroptab.c">src/gsroptab.c</a>,
|
|
|
1251 |
<a href="../src/gxdevrop.h">src/gxdevrop.h</a>,
|
|
|
1252 |
<a href="../src/gxropc.h">src/gxropc.h</a>.
|
|
|
1253 |
|
|
|
1254 |
<dt>
|
|
|
1255 |
Alpha channel and compositing:
|
|
|
1256 |
<dd>
|
|
|
1257 |
<a href="../src/gsalpha.c">src/gsalpha.c</a>,
|
|
|
1258 |
<a href="../src/gsalpha.h">src/gsalpha.h</a>,
|
|
|
1259 |
<a href="../src/gsalphac.c">src/gsalphac.c</a>,
|
|
|
1260 |
<a href="../src/gsalphac.h">src/gsalphac.h</a>,
|
|
|
1261 |
<a href="../src/gsdpnext.h">src/gsdpnext.h</a>,
|
|
|
1262 |
<a href="../src/gxalpha.h">src/gxalpha.h</a>.
|
|
|
1263 |
|
|
|
1264 |
<dt>
|
|
|
1265 |
Advanced transparency:
|
|
|
1266 |
<dd>
|
|
|
1267 |
<a href="../src/gstparam.h">src/gstparam.h</a>,
|
|
|
1268 |
<a href="../src/gstrans.c">src/gstrans.c</a>,
|
|
|
1269 |
<a href="../src/gstrans.h">src/gstrans.h</a>,
|
|
|
1270 |
<a href="../src/gxblend.c">src/gxblend.c</a>,
|
|
|
1271 |
<a href="../src/gxblend.h">src/gxblend.h</a>,
|
|
|
1272 |
<a href="../src/gdevp14.c">src/gdevp14.c</a>,
|
|
|
1273 |
<a href="../src/gdevp14.h">src/gdevp14.h</a>,
|
|
|
1274 |
<a href="../src/gdevpnga.c">src/gdevpnga.c</a>.
|
|
|
1275 |
|
|
|
1276 |
<dt>
|
|
|
1277 |
Overprint and Overprint mode:
|
|
|
1278 |
<dd>
|
|
|
1279 |
<a href="../src/gsovrc.c">src/gsovrc.c</a>,
|
|
|
1280 |
<a href="../src/gsovrc.h">src/gsovrc.h</a>,
|
|
|
1281 |
<a href="../src/gxoprect.c">src/gxoprect.c</a>,
|
|
|
1282 |
<a href="../src/gxoprect.h">src/gxoprect.h</a>.
|
|
|
1283 |
There is support for both overprint and overprint mode. There is a general
|
|
|
1284 |
compositor based implementation of these features for all devices. In addition,
|
|
|
1285 |
the memory devices implement a higher speed set of special fill routines to
|
|
|
1286 |
improve performance for printer based devices.
|
|
|
1287 |
|
|
|
1288 |
</dl>
|
|
|
1289 |
|
|
|
1290 |
<h4><a name="Clipping"></a>Clipping</h4>
|
|
|
1291 |
|
|
|
1292 |
<p>
|
|
|
1293 |
The Ghostscript graphics library implements clipping by inserting a clipping
|
|
|
1294 |
device in the device pipeline. The clipping device modifies all drawing
|
|
|
1295 |
operations to confine them to the clipping region.
|
|
|
1296 |
|
|
|
1297 |
<p>
|
|
|
1298 |
The library supports three different kinds of clipping:
|
|
|
1299 |
|
|
|
1300 |
<dl>
|
|
|
1301 |
|
|
|
1302 |
<dt>
|
|
|
1303 |
Region/path clipping
|
|
|
1304 |
<dd>
|
|
|
1305 |
This corresponds to the PostScript concept of a clipping path. The clipping
|
|
|
1306 |
region is specified either by a list of rectangles (subject to the
|
|
|
1307 |
constraints documented in <a href="../src/gxcpath.h">src/gxcpath.h</a>), or
|
|
|
1308 |
by a path that is converted to such a list of rectangles.
|
|
|
1309 |
|
|
|
1310 |
<dt>
|
|
|
1311 |
Stationary mask clipping
|
|
|
1312 |
<dd>
|
|
|
1313 |
This corresponds to the mask operand of a PostScript ImageType 3 image. The
|
|
|
1314 |
clipping region is specified by a bitmap and an (X,Y) offset in the
|
|
|
1315 |
coordinate space.
|
|
|
1316 |
|
|
|
1317 |
<dt>
|
|
|
1318 |
Tiled mask clipping
|
|
|
1319 |
<dd>
|
|
|
1320 |
This corresponds to the region painted by a PostScript Pattern, for the case
|
|
|
1321 |
where the Pattern does not completely cover its bounding box but the
|
|
|
1322 |
combined transformation matrix has no skew or non-orthogonal rotation (i.e.,
|
|
|
1323 |
XStep and YStep map respectively to (X,0) and (0,Y) or vice versa). The
|
|
|
1324 |
clipping region is specified by a bitmap and an (X,Y) offset in the
|
|
|
1325 |
coordinate space, and is replicated indefinitely in both X and Y.
|
|
|
1326 |
|
|
|
1327 |
</dl>
|
|
|
1328 |
|
|
|
1329 |
<p>
|
|
|
1330 |
Note that simply scan-converting a clipping path in the usual way does not
|
|
|
1331 |
produce a succession of rectangles that can simply be stored as the list for
|
|
|
1332 |
region-based clipping: in general, the rectangles do not satisfy the
|
|
|
1333 |
constraint for rectangle lists specified in <a
|
|
|
1334 |
href="../src/gxcpath.h">src/gxcpath.h</a>, since they may overlap in X, Y,
|
|
|
1335 |
or both. A non-trivial "clipping list accumulator" device is needed to
|
|
|
1336 |
produce a rectangle list that does satisfy the constraint.
|
|
|
1337 |
|
|
|
1338 |
<dl>
|
|
|
1339 |
|
|
|
1340 |
<dt>
|
|
|
1341 |
Clipping support:
|
|
|
1342 |
<dd>
|
|
|
1343 |
<a href="../src/gxclip.c">src/gxclip.c</a>,
|
|
|
1344 |
<a href="../src/gxclip.h">src/gxclip.h</a>.
|
|
|
1345 |
|
|
|
1346 |
<dt>
|
|
|
1347 |
Region/path clipping:
|
|
|
1348 |
<dd>
|
|
|
1349 |
<a href="../src/gxcpath.c">src/gxcpath.c</a>,
|
|
|
1350 |
<a href="../src/gxcpath.h">src/gxcpath.h</a>,
|
|
|
1351 |
<a href="../src/gzcpath.h">src/gzcpath.h</a>.
|
|
|
1352 |
|
|
|
1353 |
<dt>
|
|
|
1354 |
Clipping list accumulator:
|
|
|
1355 |
<dd>
|
|
|
1356 |
<a href="../src/gxacpath.c">src/gxacpath.c</a>,
|
|
|
1357 |
<a href="../src/gzacpath.h">src/gzacpath.h</a>.
|
|
|
1358 |
|
|
|
1359 |
<dt>
|
|
|
1360 |
Mask clipping support:
|
|
|
1361 |
<dd>
|
|
|
1362 |
<a href="../src/gxmclip.c">src/gxmclip.c</a>,
|
|
|
1363 |
<a href="../src/gxmclip.h">src/gxmclip.h</a>.
|
|
|
1364 |
|
|
|
1365 |
<dt>
|
|
|
1366 |
Stationary mask clipping:
|
|
|
1367 |
<dd>
|
|
|
1368 |
<a href="../src/gxclipm.c">src/gxclipm.c</a>,
|
|
|
1369 |
<a href="../src/gxclipm.h">src/gxclipm.h</a>.
|
|
|
1370 |
|
|
|
1371 |
<dt>
|
|
|
1372 |
Tiled mask clipping:
|
|
|
1373 |
<dd>
|
|
|
1374 |
<a href="../src/gxclip2.c">src/gxclip2.c</a>,
|
|
|
1375 |
<a href="../src/gxclip2.h">src/gxclip2.h</a>.
|
|
|
1376 |
|
|
|
1377 |
</dl>
|
|
|
1378 |
|
|
|
1379 |
<h4><a name="Other_graphics"></a>Other graphics</h4>
|
|
|
1380 |
|
|
|
1381 |
<dl>
|
|
|
1382 |
|
|
|
1383 |
<dt>
|
|
|
1384 |
Miscellaneous graphics state:
|
|
|
1385 |
<dd>
|
|
|
1386 |
<a href="../src/gsclipsr.c">src/gsclipsr.c</a>,
|
|
|
1387 |
<a href="../src/gsclipsr.h">src/gsclipsr.h</a>,
|
|
|
1388 |
<a href="../src/gsdps.c">src/gsdps.c</a>,
|
|
|
1389 |
<a href="../src/gsdps.h">src/gsdps.h</a>,
|
|
|
1390 |
<a href="../src/gsdps1.c">src/gsdps1.c</a>,
|
|
|
1391 |
<a href="../src/gsistate.c">src/gsistate.c</a>,
|
|
|
1392 |
<a href="../src/gsline.c">src/gsline.c</a>,
|
|
|
1393 |
<a href="../src/gsline.h">src/gsline.h</a>,
|
|
|
1394 |
<a href="../src/gslparam.h">src/gslparam.h</a>,
|
|
|
1395 |
<a href="../src/gsstate.c">src/gsstate.c</a>,
|
|
|
1396 |
<a href="../src/gsstate.h">src/gsstate.h</a>,
|
|
|
1397 |
<a href="../src/gstrap.c">src/gstrap.c</a>,
|
|
|
1398 |
<a href="../src/gstrap.h">src/gstrap.h</a>,
|
|
|
1399 |
<a href="../src/gxclipsr.h">src/gxclipsr.h</a>,
|
|
|
1400 |
<a href="../src/gxistate.h">src/gxistate.h</a>,
|
|
|
1401 |
<a href="../src/gxline.h">src/gxline.h</a>,
|
|
|
1402 |
<a href="../src/gxstate.h">src/gxstate.h</a>,
|
|
|
1403 |
<a href="../src/gzline.h">src/gzline.h</a>,
|
|
|
1404 |
<a href="../src/gzstate.h">src/gzstate.h</a>.
|
|
|
1405 |
|
|
|
1406 |
</dl>
|
|
|
1407 |
|
|
|
1408 |
<h4><a name="FAPI_support_gx"></a>Font API support</h4>
|
|
|
1409 |
|
|
|
1410 |
<dl>
|
|
|
1411 |
|
|
|
1412 |
<dt>
|
|
|
1413 |
UFST bridge:
|
|
|
1414 |
<dd>
|
|
|
1415 |
<a href="../src/gxfapi.c">src/gxfapi.c</a>,
|
|
|
1416 |
<a href="../src/gxfapi.h">src/gxfapi.h</a>.
|
|
|
1417 |
</dl>
|
|
|
1418 |
|
|
|
1419 |
|
|
|
1420 |
<h4><a name="Driver_support"></a>Driver support</h4>
|
|
|
1421 |
|
|
|
1422 |
<dl>
|
|
|
1423 |
|
|
|
1424 |
<dt>
|
|
|
1425 |
Generic driver support:
|
|
|
1426 |
<dd>
|
|
|
1427 |
<a href="../src/gdevdcrd.c">src/gdevdcrd.c</a>,
|
|
|
1428 |
<a href="../src/gdevdcrd.h">src/gdevdcrd.h</a>,
|
|
|
1429 |
<a href="../src/gdevdsha.c">src/gdevdsha.c</a>,
|
|
|
1430 |
<a href="../src/gdevemap.c">src/gdevemap.c</a>,
|
|
|
1431 |
<a href="../src/gsdevice.c">src/gsdevice.c</a>,
|
|
|
1432 |
<a href="../src/gsdevice.h">src/gsdevice.h</a>,
|
|
|
1433 |
<a href="../src/gsdparam.c">src/gsdparam.c</a>,
|
|
|
1434 |
<a href="../src/gsxfont.h">src/gsxfont.h</a>,
|
|
|
1435 |
<a href="../src/gxdevbuf.h">src/gxdevbuf.h</a>,
|
|
|
1436 |
<a href="../src/gxdevcli.h">src/gxdevcli.h</a>,
|
|
|
1437 |
<a href="../src/gxdevice.h">src/gxdevice.h</a>,
|
|
|
1438 |
<a href="../src/gxrplane.h">src/gxrplane.h</a>,
|
|
|
1439 |
<a href="../src/gxxfont.h">src/gxxfont.h</a>.
|
|
|
1440 |
|
|
|
1441 |
<dt>
|
|
|
1442 |
Accessing rendered bits:
|
|
|
1443 |
<dd>
|
|
|
1444 |
<a href="../src/gdevdbit.c">src/gdevdbit.c</a>,
|
|
|
1445 |
<a href="../src/gdevdgbr.c">src/gdevdgbr.c</a>,
|
|
|
1446 |
<a href="../src/gxbitfmt.h">src/gxbitfmt.h</a>,
|
|
|
1447 |
<a href="../src/gxgetbit.h">src/gxgetbit.h</a>.
|
|
|
1448 |
|
|
|
1449 |
<dt>
|
|
|
1450 |
"Printer" driver support:
|
|
|
1451 |
<dd>
|
|
|
1452 |
<a href="../src/gdevmeds.c">src/gdevmeds.c</a>,
|
|
|
1453 |
<a href="../src/gdevmeds.h">src/gdevmeds.h</a>,
|
|
|
1454 |
<a href="../src/gdevppla.c">src/gdevppla.c</a>,
|
|
|
1455 |
<a href="../src/gdevppla.h">src/gdevppla.h</a>,
|
|
|
1456 |
<a href="../src/gdevprn.c">src/gdevprn.c</a>,
|
|
|
1457 |
<a href="../src/gdevprn.h">src/gdevprn.h</a>,
|
|
|
1458 |
<a href="../src/gdevprna.c">src/gdevprna.c</a>,
|
|
|
1459 |
<a href="../src/gdevprna.h">src/gdevprna.h</a>,
|
|
|
1460 |
<a href="../src/gxband.h">src/gxband.h</a>,
|
|
|
1461 |
<a href="../src/gxpageq.c">src/gxpageq.c</a>,
|
|
|
1462 |
<a href="../src/gxpageq.h">src/gxpageq.h</a>.
|
|
|
1463 |
|
|
|
1464 |
<dt>
|
|
|
1465 |
High-level device support:
|
|
|
1466 |
<dd>
|
|
|
1467 |
<a href="../src/gdevvec.c">src/gdevvec.c</a>,
|
|
|
1468 |
<a href="../src/gdevvec.h">src/gdevvec.h</a>,
|
|
|
1469 |
<a href="../src/gxhldevc.c">src/gxhldevc.c</a>,
|
|
|
1470 |
<a href="../src/gxhldevc.h">src/gxhldevc.h</a>.
|
|
|
1471 |
|
|
|
1472 |
<dt>
|
|
|
1473 |
Banding:
|
|
|
1474 |
<dd>
|
|
|
1475 |
<a href="../src/gxclbits.c">src/gxclbits.c</a>,
|
|
|
1476 |
<a href="../src/gxcldev.h">src/gxcldev.h</a>,
|
|
|
1477 |
<a href="../src/gxclfile.c">src/gxclfile.c</a>,
|
|
|
1478 |
<a href="../src/gxclimag.c">src/gxclimag.c</a>,
|
|
|
1479 |
<a href="../src/gxclio.h">src/gxclio.h</a>,
|
|
|
1480 |
<a href="../src/gxclist.c">src/gxclist.c</a>,
|
|
|
1481 |
<a href="../src/gxclist.h">src/gxclist.h</a>,
|
|
|
1482 |
<a href="../src/gxcllzw.c">src/gxcllzw.c</a>,
|
|
|
1483 |
<a href="../src/gxclmem.c">src/gxclmem.c</a>,
|
|
|
1484 |
<a href="../src/gxclmem.h">src/gxclmem.h</a>,
|
|
|
1485 |
<a href="../src/gxclpage.c">src/gxclpage.c</a>,
|
|
|
1486 |
<a href="../src/gxclpage.h">src/gxclpage.h</a>,
|
|
|
1487 |
<a href="../src/gxclpath.c">src/gxclpath.c</a>,
|
|
|
1488 |
<a href="../src/gxclpath.h">src/gxclpath.h</a>,
|
|
|
1489 |
<a href="../src/gxclrast.c">src/gxclrast.c</a>,
|
|
|
1490 |
<a href="../src/gxclread.c">src/gxclread.c</a>,
|
|
|
1491 |
<a href="../src/gxclrect.c">src/gxclrect.c</a>,
|
|
|
1492 |
<a href="../src/gxclutil.c">src/gxclutil.c</a>,
|
|
|
1493 |
<a href="../src/gxclzlib.c">src/gxclzlib.c</a>,
|
|
|
1494 |
<a href="../src/gxdhtserial.c">src/gxdhtserial.c</a>,
|
|
|
1495 |
<a href="../src/gxdhtserial.h">src/gxdhtserial.h</a>,
|
|
|
1496 |
<a href="../src/gsserial.c">src/gsserial.c</a>,
|
|
|
1497 |
<a href="../src/gsserial.h">src/gsserial.h</a>.
|
|
|
1498 |
|
|
|
1499 |
</dl>
|
|
|
1500 |
|
|
|
1501 |
<h4><a name="Visual_trace"></a>Visual Trace</h4>
|
|
|
1502 |
|
|
|
1503 |
<dl>
|
|
|
1504 |
|
|
|
1505 |
<dt>
|
|
|
1506 |
Visual Trace support :
|
|
|
1507 |
<dd>
|
|
|
1508 |
<a href="../src/vdtrace.h">src/vdtrace.h</a>,
|
|
|
1509 |
<a href="../src/vdtrace.c">src/vdtrace.c</a>.
|
|
|
1510 |
</dl>
|
|
|
1511 |
|
|
|
1512 |
See <a href="Lib.htm">doc/Lib.htm</a> for extensive documentation on
|
|
|
1513 |
Visual Trace instructions.
|
|
|
1514 |
|
|
|
1515 |
|
|
|
1516 |
<h3><a name="Device_drivers"></a>Device drivers</h3>
|
|
|
1517 |
|
|
|
1518 |
<p>
|
|
|
1519 |
See <a href="Drivers.htm">doc/Drivers.htm</a> for extensive documentation on
|
|
|
1520 |
the interface between the core code and drivers.
|
|
|
1521 |
|
|
|
1522 |
<p>
|
|
|
1523 |
The driver API includes high-level (path / image / text), mid-level
|
|
|
1524 |
(polygon), and low-level (rectangle / raster) operations. Most devices
|
|
|
1525 |
implement only the low-level operations, and let generic code break down the
|
|
|
1526 |
high-level operations. However, some devices produce high-level output, and
|
|
|
1527 |
therefore must implement the high-level operations.
|
|
|
1528 |
|
|
|
1529 |
<h4><a name="Internal_devices"></a>Internal devices</h4>
|
|
|
1530 |
|
|
|
1531 |
<p>
|
|
|
1532 |
There are a number of "devices" that serve internal purposes. Some of these
|
|
|
1533 |
are meant to be real rendering targets; others are intended for use in
|
|
|
1534 |
device pipelines. The rendering targets are:
|
|
|
1535 |
|
|
|
1536 |
<dl>
|
|
|
1537 |
|
|
|
1538 |
<dt>
|
|
|
1539 |
Memory devices, depth-independent:
|
|
|
1540 |
<dd>
|
|
|
1541 |
<a href="../src/gdevmem.c">src/gdevmem.c</a>,
|
|
|
1542 |
<a href="../src/gdevmem.h">src/gdevmem.h</a>,
|
|
|
1543 |
<a href="../src/gdevmpla.c">src/gdevmpla.c</a>,
|
|
|
1544 |
<a href="../src/gdevmpla.h">src/gdevmpla.h</a>,
|
|
|
1545 |
<a href="../src/gdevmrop.h">src/gdevmrop.h</a>,
|
|
|
1546 |
<a href="../src/gsdevmem.c">src/gsdevmem.c</a>,
|
|
|
1547 |
<a href="../src/gxdevmem.h">src/gxdevmem.h</a>.
|
|
|
1548 |
|
|
|
1549 |
<dt>
|
|
|
1550 |
Memory devices, specific depths:
|
|
|
1551 |
<dd>
|
|
|
1552 |
<a href="../src/gdevm1.c">src/gdevm1.c</a>,
|
|
|
1553 |
<a href="../src/gdevm2.c">src/gdevm2.c</a>,
|
|
|
1554 |
<a href="../src/gdevm4.c">src/gdevm4.c</a>,
|
|
|
1555 |
<a href="../src/gdevm8.c">src/gdevm8.c</a>,
|
|
|
1556 |
<a href="../src/gdevm16.c">src/gdevm16.c</a>,
|
|
|
1557 |
<a href="../src/gdevm24.c">src/gdevm24.c</a>,
|
|
|
1558 |
<a href="../src/gdevm32.c">src/gdevm32.c</a>,
|
|
|
1559 |
<a href="../src/gdevm40.c">src/gdevm40.c</a>,
|
|
|
1560 |
<a href="../src/gdevm48.c">src/gdevm48.c</a>,
|
|
|
1561 |
<a href="../src/gdevm56.c">src/gdevm56.c</a>,
|
|
|
1562 |
<a href="../src/gdevm64.c">src/gdevm64.c</a>,
|
|
|
1563 |
<a href="../src/gdevmr1.c">src/gdevmr1.c</a>,
|
|
|
1564 |
<a href="../src/gdevmr2n.c">src/gdevmr2n.c</a>,
|
|
|
1565 |
<a href="../src/gdevmr8n.c">src/gdevmr8n.c</a>.
|
|
|
1566 |
|
|
|
1567 |
<dt>
|
|
|
1568 |
Alpha-related devices:
|
|
|
1569 |
<dd>
|
|
|
1570 |
<a href="../src/gdevabuf.c">src/gdevabuf.c</a>.
|
|
|
1571 |
|
|
|
1572 |
<dt>
|
|
|
1573 |
Other devices:
|
|
|
1574 |
<dd>
|
|
|
1575 |
<a href="../src/gdevdflt.c">src/gdevdflt.c</a>,
|
|
|
1576 |
<a href="../src/gdevhit.c">src/gdevhit.c</a>,
|
|
|
1577 |
<a href="../src/gdevmrun.c">src/gdevmrun.c</a>,
|
|
|
1578 |
<a href="../src/gdevmrun.h">src/gdevmrun.h</a>,
|
|
|
1579 |
<a href="../src/gdevplnx.c">src/gdevplnx.c</a>,
|
|
|
1580 |
<a href="../src/gdevplnx.h">src/gdevplnx.h</a>.
|
|
|
1581 |
</dl>
|
|
|
1582 |
|
|
|
1583 |
<p>
|
|
|
1584 |
The forwarding devices meant for use in pipelines are:
|
|
|
1585 |
|
|
|
1586 |
<dl>
|
|
|
1587 |
|
|
|
1588 |
<dt>
|
|
|
1589 |
The bounding box device:
|
|
|
1590 |
<dd>
|
|
|
1591 |
<a href="../src/gdevbbox.h">src/gdevbbox.h</a>,
|
|
|
1592 |
<a href="../src/gdevbbox.c">src/gdevbbox.c</a>.
|
|
|
1593 |
|
|
|
1594 |
<dt>
|
|
|
1595 |
Clipping devices:
|
|
|
1596 |
<dd>
|
|
|
1597 |
See under <a href="#Clipping">Clipping</a> above.
|
|
|
1598 |
|
|
|
1599 |
<dt>
|
|
|
1600 |
Device filter stack:
|
|
|
1601 |
<dd>
|
|
|
1602 |
<a href="../src/gsdfilt.c">src/gsdfilt.c</a>,
|
|
|
1603 |
<a href="../src/gsdfilt.h">src/gsdfilt.h</a>.
|
|
|
1604 |
|
|
|
1605 |
<dt>
|
|
|
1606 |
Other devices:
|
|
|
1607 |
<dd>
|
|
|
1608 |
<a href="../src/gdevcmap.c">src/gdevcmap.c</a>,
|
|
|
1609 |
<a href="../src/gdevcmap.h">src/gdevcmap.h</a>,
|
|
|
1610 |
<a href="../src/gdevnfwd.c">src/gdevnfwd.c</a>.
|
|
|
1611 |
|
|
|
1612 |
</dl>
|
|
|
1613 |
|
|
|
1614 |
<h4><a name="PS_and_PDF_writers"></a>PostScript and PDF writers</h4>
|
|
|
1615 |
|
|
|
1616 |
<p>
|
|
|
1617 |
Because PostScript and PDF have the same graphics model, lexical syntax, and
|
|
|
1618 |
stack-based execution model, the drivers that produce PostScript and PDF
|
|
|
1619 |
output share a significant amount of support code. In the future, the
|
|
|
1620 |
PostScript output driver should be replaced with a slightly modified version
|
|
|
1621 |
of the PDF driver, since the latter is far more sophisticated (in
|
|
|
1622 |
particular, it has extensive facilities for image compression and for
|
|
|
1623 |
handling text and fonts).
|
|
|
1624 |
|
|
|
1625 |
<p>
|
|
|
1626 |
The PDF code for handling text and fonts is complex and fragile. A major
|
|
|
1627 |
rewrite in June 2002 was intended to make it more robust and somewhat easier
|
|
|
1628 |
to understand, but also increased its size by about 40%, contrary to the
|
|
|
1629 |
expectation that it would shrink. Currently both sets of code are in the
|
|
|
1630 |
code base, with compatible APIs, selected by a line in <a
|
|
|
1631 |
href="../src/devs.mak">src/devs.mak</a>.
|
|
|
1632 |
|
|
|
1633 |
<dl>
|
|
|
1634 |
|
|
|
1635 |
<dt>
|
|
|
1636 |
Shared support:
|
|
|
1637 |
<dd>
|
|
|
1638 |
|
|
|
1639 |
<dl>
|
|
|
1640 |
Writing fonts:
|
|
|
1641 |
<dd>
|
|
|
1642 |
<a href="../src/gdevpsf.h">src/gdevpsf.h</a>,
|
|
|
1643 |
<a href="../src/gdevpsf1.c">src/gdevpsf1.c</a>,
|
|
|
1644 |
<a href="../src/gdevpsf2.c">src/gdevpsf2.c</a>,
|
|
|
1645 |
<a href="../src/gdevpsfm.c">src/gdevpsfm.c</a>,
|
|
|
1646 |
<a href="../src/gdevpsft.c">src/gdevpsft.c</a>,
|
|
|
1647 |
<a href="../src/gdevpsfu.c">src/gdevpsfu.c</a>,
|
|
|
1648 |
<a href="../src/gdevpsfx.c">src/gdevpsfx.c</a>,
|
|
|
1649 |
<a href="../src/gscedata.c">src/gscedata.c</a>,
|
|
|
1650 |
<a href="../src/gscedata.h">src/gscedata.h</a>,
|
|
|
1651 |
<a href="../src/gscencs.c">src/gscencs.c</a>,
|
|
|
1652 |
<a href="../src/gscencs.h">src/gscencs.h</a>.
|
|
|
1653 |
|
|
|
1654 |
<dt>
|
|
|
1655 |
Other:
|
|
|
1656 |
<dd>
|
|
|
1657 |
<a href="../src/gdevpsdf.h">src/gdevpsdf.h</a>,
|
|
|
1658 |
<a href="../src/gdevpsdi.c">src/gdevpsdi.c</a>,
|
|
|
1659 |
<a href="../src/gdevpsdp.c">src/gdevpsdp.c</a>,
|
|
|
1660 |
<a href="../src/gdevpsds.c">src/gdevpsds.c</a>,
|
|
|
1661 |
<a href="../src/gdevpsds.h">src/gdevpsds.h</a>,
|
|
|
1662 |
<a href="../src/gdevpsdu.c">src/gdevpsdu.c</a>.
|
|
|
1663 |
|
|
|
1664 |
</dl>
|
|
|
1665 |
|
|
|
1666 |
<dt>
|
|
|
1667 |
PostScript output driver ([e]pswrite):
|
|
|
1668 |
<dd>
|
|
|
1669 |
<a href="../src/gdevps.c">src/gdevps.c</a>,
|
|
|
1670 |
<a href="../src/gdevpsu.c">src/gdevpsu.c</a>,
|
|
|
1671 |
<a href="../src/gdevpsu.h">src/gdevpsu.h</a>.
|
|
|
1672 |
|
|
|
1673 |
<dt>
|
|
|
1674 |
PDF output driver (pdfwrite):
|
|
|
1675 |
<dd>
|
|
|
1676 |
<dl>
|
|
|
1677 |
|
|
|
1678 |
<dt>
|
|
|
1679 |
Substrate:
|
|
|
1680 |
<dd>
|
|
|
1681 |
<a href="../src/gdevpdfo.c">src/gdevpdfo.c</a>,
|
|
|
1682 |
<a href="../src/gdevpdfo.h">src/gdevpdfo.h</a>,
|
|
|
1683 |
<a href="../src/gdevpdfr.c">src/gdevpdfr.c</a>,
|
|
|
1684 |
<a href="../src/gdevpdfu.c">src/gdevpdfu.c</a>.
|
|
|
1685 |
|
|
|
1686 |
<dt>
|
|
|
1687 |
Old text and fonts:
|
|
|
1688 |
<dd>
|
|
|
1689 |
<a href="../src/gdevpdfe.c">src/gdevpdfe.c</a>,
|
|
|
1690 |
<a href="../src/gdevpdff.c">src/gdevpdff.c</a>,
|
|
|
1691 |
<a href="../src/gdevpdff.h">src/gdevpdff.h</a>,
|
|
|
1692 |
<a href="../src/gdevpdfs.c">src/gdevpdfs.c</a>,
|
|
|
1693 |
<a href="../src/gdevpdft.c">src/gdevpdft.c</a>,
|
|
|
1694 |
<a href="../src/gdevpdft.h">src/gdevpdft.h</a>,
|
|
|
1695 |
<a href="../src/gdevpdfw.c">src/gdevpdfw.c</a>.
|
|
|
1696 |
|
|
|
1697 |
<dt>
|
|
|
1698 |
New text and fonts:
|
|
|
1699 |
<dd>
|
|
|
1700 |
<a href="../src/gdevpdt.c">src/gdevpdt.c</a>,
|
|
|
1701 |
<a href="../src/gdevpdt.h">src/gdevpdt.h</a>,
|
|
|
1702 |
<a href="../src/gdevpdtb.c">src/gdevpdtb.c</a>,
|
|
|
1703 |
<a href="../src/gdevpdtb.h">src/gdevpdtb.h</a>,
|
|
|
1704 |
<a href="../src/gdevpdtc.c">src/gdevpdtc.c</a>,
|
|
|
1705 |
<a href="../src/gdevpdtd.c">src/gdevpdtd.c</a>,
|
|
|
1706 |
<a href="../src/gdevpdtd.h">src/gdevpdtd.h</a>,
|
|
|
1707 |
<a href="../src/gdevpdte.c">src/gdevpdte.c</a>,
|
|
|
1708 |
<a href="../src/gdevpdtf.c">src/gdevpdtf.c</a>,
|
|
|
1709 |
<a href="../src/gdevpdtf.h">src/gdevpdtf.h</a>,
|
|
|
1710 |
<a href="../src/gdevpdti.c">src/gdevpdti.c</a>,
|
|
|
1711 |
<a href="../src/gdevpdti.h">src/gdevpdti.h</a>,
|
|
|
1712 |
<a href="../src/gdevpdts.c">src/gdevpdts.c</a>,
|
|
|
1713 |
<a href="../src/gdevpdts.h">src/gdevpdts.h</a>,
|
|
|
1714 |
<a href="../src/gdevpdtt.c">src/gdevpdtt.c</a>,
|
|
|
1715 |
<a href="../src/gdevpdtt.h">src/gdevpdtt.h</a>,
|
|
|
1716 |
<a href="../src/gdevpdtv.c">src/gdevpdtv.c</a>,
|
|
|
1717 |
<a href="../src/gdevpdtv.h">src/gdevpdtv.h</a>,
|
|
|
1718 |
<a href="../src/gdevpdtw.c">src/gdevpdtw.c</a>,
|
|
|
1719 |
<a href="../src/gdevpdtw.h">src/gdevpdtw.h</a>,
|
|
|
1720 |
<a href="../src/gdevpdtx.h">src/gdevpdtx.h</a>.
|
|
|
1721 |
|
|
|
1722 |
<dt>
|
|
|
1723 |
Graphics:
|
|
|
1724 |
<dd>
|
|
|
1725 |
<a href="../src/gdevpdfc.c">src/gdevpdfc.c</a>,
|
|
|
1726 |
<a href="../src/gdevpdfc.h">src/gdevpdfc.h</a>,
|
|
|
1727 |
<a href="../src/gdevpdfd.c">src/gdevpdfd.c</a>,
|
|
|
1728 |
<a href="../src/gdevpdfg.c">src/gdevpdfg.c</a>,
|
|
|
1729 |
<a href="../src/gdevpdfg.h">src/gdevpdfg.h</a>,
|
|
|
1730 |
<a href="../src/gdevpdfk.c">src/gdevpdfk.c</a>,
|
|
|
1731 |
<a href="../src/gdevpdft.c">src/gdevpdft.c</a>.
|
|
|
1732 |
<a href="../src/gdevpdfv.c">src/gdevpdfv.c</a>.
|
|
|
1733 |
|
|
|
1734 |
<dt>
|
|
|
1735 |
Images:
|
|
|
1736 |
<dd>
|
|
|
1737 |
<a href="../src/gdevpdfb.c">src/gdevpdfb.c</a>,
|
|
|
1738 |
<a href="../src/gdevpdfi.c">src/gdevpdfi.c</a>,
|
|
|
1739 |
<a href="../src/gdevpdfj.c">src/gdevpdfj.c</a>.
|
|
|
1740 |
|
|
|
1741 |
<dt>
|
|
|
1742 |
Other:
|
|
|
1743 |
<dd>
|
|
|
1744 |
<a href="../src/gdevpdf.c">src/gdevpdf.c</a>,
|
|
|
1745 |
<a href="../src/gdevpdfm.c">src/gdevpdfm.c</a>,
|
|
|
1746 |
<a href="../src/gdevpdfp.c">src/gdevpdfp.c</a>,
|
|
|
1747 |
<a href="../src/gdevpdfx.h">src/gdevpdfx.h</a>.
|
|
|
1748 |
<a href="../src/gdevpdfb.h">src/gdevpdfb.h</a>.
|
|
|
1749 |
|
|
|
1750 |
</dl>
|
|
|
1751 |
|
|
|
1752 |
</dl>
|
|
|
1753 |
|
|
|
1754 |
<h4><a name="High_level_devices"></a>Other high-level devices</h4>
|
|
|
1755 |
|
|
|
1756 |
<p>
|
|
|
1757 |
Currently, the CGM driver is raster-only. If anyone cares seriously about
|
|
|
1758 |
CGM in the future, this driver should be upgraded to a higher level.
|
|
|
1759 |
|
|
|
1760 |
<dl>
|
|
|
1761 |
|
|
|
1762 |
<dt>
|
|
|
1763 |
PCL XL output device (pxlmono, pxlcolor):
|
|
|
1764 |
<dd>
|
|
|
1765 |
<a href="../src/gdevpx.c">src/gdevpx.c</a>,
|
|
|
1766 |
<a href="../src/gdevpxat.h">src/gdevpxat.h</a>,
|
|
|
1767 |
<a href="../src/gdevpxen.h">src/gdevpxen.h</a>,
|
|
|
1768 |
<a href="../src/gdevpxop.h">src/gdevpxop.h</a>,
|
|
|
1769 |
<a href="../src/gdevpxut.c">src/gdevpxut.c</a>,
|
|
|
1770 |
<a href="../src/gdevpxut.h">src/gdevpxut.h</a>.
|
|
|
1771 |
|
|
|
1772 |
<dt>
|
|
|
1773 |
Other high-level devices:
|
|
|
1774 |
<dd>
|
|
|
1775 |
<a href="../src/gdevtrac.c">src/gdevtrac.c</a>.
|
|
|
1776 |
|
|
|
1777 |
</dl>
|
|
|
1778 |
|
|
|
1779 |
<h4><a name="Other_maintained_drivers"></a>Other maintained drivers</h4>
|
|
|
1780 |
|
|
|
1781 |
<p>
|
|
|
1782 |
The standard Ghostscript distribution includes a collection of drivers,
|
|
|
1783 |
mostly written by Aladdin Enterprises, that are "maintained" in the same
|
|
|
1784 |
sense as the Ghostscript core code.
|
|
|
1785 |
|
|
|
1786 |
<dl>
|
|
|
1787 |
|
|
|
1788 |
<dt>
|
|
|
1789 |
Display drivers:
|
|
|
1790 |
<dd>
|
|
|
1791 |
<a href="../src/gdev8bcm.c">src/gdev8bcm.c</a>,
|
|
|
1792 |
<a href="../src/gdev8bcm.h">src/gdev8bcm.h</a>,
|
|
|
1793 |
<a href="../src/gdevegaa.asm">src/gdevegaa.asm</a>,
|
|
|
1794 |
<a href="../src/gdevevga.c">src/gdevevga.c</a>,
|
|
|
1795 |
<a href="../src/gdevl256.c">src/gdevl256.c</a>,
|
|
|
1796 |
<a href="../src/gdevpccm.c">src/gdevpccm.c</a>,
|
|
|
1797 |
<a href="../src/gdevpccm.h">src/gdevpccm.h</a>,
|
|
|
1798 |
<a href="../src/gdevpcfb.c">src/gdevpcfb.c</a>,
|
|
|
1799 |
<a href="../src/gdevpcfb.h">src/gdevpcfb.h</a>,
|
|
|
1800 |
<a href="../src/gdevs3ga.c">src/gdevs3ga.c</a>,
|
|
|
1801 |
<a href="../src/gdevsco.c">src/gdevsco.c</a>,
|
|
|
1802 |
<a href="../src/gdevsvga.c">src/gdevsvga.c</a>,
|
|
|
1803 |
<a href="../src/gdevsvga.h">src/gdevsvga.h</a>,
|
|
|
1804 |
<a href="../src/gdevvglb.c">src/gdevvglb.c</a>.
|
|
|
1805 |
|
|
|
1806 |
<dt>
|
|
|
1807 |
Window system drivers:
|
|
|
1808 |
<dd>
|
|
|
1809 |
|
|
|
1810 |
<dl>
|
|
|
1811 |
|
|
|
1812 |
<dt>
|
|
|
1813 |
X Windows:
|
|
|
1814 |
<dd>
|
|
|
1815 |
<a href="../src/gdevx.c">src/gdevx.c</a>,
|
|
|
1816 |
<a href="../src/gdevx.h">src/gdevx.h</a>,
|
|
|
1817 |
<a href="../src/gdevxalt.c">src/gdevxalt.c</a>,
|
|
|
1818 |
<a href="../src/gdevxcmp.c">src/gdevxcmp.c</a>,
|
|
|
1819 |
<a href="../src/gdevxcmp.h">src/gdevxcmp.h</a>,
|
|
|
1820 |
<a href="../src/gdevxini.c">src/gdevxini.c</a>,
|
|
|
1821 |
<a href="../src/gdevxres.c">src/gdevxres.c</a>,
|
|
|
1822 |
<a href="../src/gdevxxf.c">src/gdevxxf.c</a>.
|
|
|
1823 |
|
|
|
1824 |
<dt>
|
|
|
1825 |
Microsoft Windows:
|
|
|
1826 |
<dd>
|
|
|
1827 |
<a href="../src/gdevmswn.c">src/gdevmswn.c</a>,
|
|
|
1828 |
<a href="../src/gdevmswn.h">src/gdevmswn.h</a>,
|
|
|
1829 |
<a href="../src/gdevmsxf.c">src/gdevmsxf.c</a>,
|
|
|
1830 |
<a href="../src/gdevwddb.c">src/gdevwddb.c</a>,
|
|
|
1831 |
<a href="../src/gdevwdib.c">src/gdevwdib.c</a>.
|
|
|
1832 |
|
|
|
1833 |
<dt>
|
|
|
1834 |
OS/2 Presentation Manager:
|
|
|
1835 |
<dd>
|
|
|
1836 |
<a href="../src/gdevpm.c">src/gdevpm.c</a>,
|
|
|
1837 |
<a href="../src/gdevpm.h">src/gdevpm.h</a>,
|
|
|
1838 |
<a href="../src/gspmdrv.c">src/gspmdrv.c</a>,
|
|
|
1839 |
<a href="../src/gspmdrv.h">src/gspmdrv.h</a>.
|
|
|
1840 |
|
|
|
1841 |
</dl>
|
|
|
1842 |
|
|
|
1843 |
<dt>
|
|
|
1844 |
Raster file output drivers:
|
|
|
1845 |
<dd>
|
|
|
1846 |
|
|
|
1847 |
<dl>
|
|
|
1848 |
|
|
|
1849 |
<dt>
|
|
|
1850 |
Fax and TIFF:
|
|
|
1851 |
<dd>
|
|
|
1852 |
<a href="../src/gdevfax.c">src/gdevfax.c</a>,
|
|
|
1853 |
<a href="../src/gdevfax.h">src/gdevfax.h</a>,
|
|
|
1854 |
<a href="../src/gdevtfax.c">src/gdevtfax.c</a>,
|
|
|
1855 |
<a href="../src/gdevtfax.h">src/gdevtfax.h</a>,
|
|
|
1856 |
<a href="../src/gdevtifs.c">src/gdevtifs.c</a>,
|
|
|
1857 |
<a href="../src/gdevtifs.h">src/gdevtifs.h</a>,
|
|
|
1858 |
<a href="../src/gdevtfnx.c">src/gdevtfnx.c</a>.
|
|
|
1859 |
<a href="../src/gdevtsep.c">src/gdevtsep.c</a>.
|
|
|
1860 |
|
|
|
1861 |
<dt>
|
|
|
1862 |
(Low-level) CGM:
|
|
|
1863 |
<dd>
|
|
|
1864 |
<a href="../src/gdevcgm.c">src/gdevcgm.c</a>,
|
|
|
1865 |
<a href="../src/gdevcgml.c">src/gdevcgml.c</a>,
|
|
|
1866 |
<a href="../src/gdevcgml.h">src/gdevcgml.h</a>,
|
|
|
1867 |
<a href="../src/gdevcgmx.h">src/gdevcgmx.h</a>.
|
|
|
1868 |
|
|
|
1869 |
<dt>
|
|
|
1870 |
Example DeviceN devices:
|
|
|
1871 |
<dd>
|
|
|
1872 |
<a href="../src/gdevdevn.c">src/gdevdevn.c</a>,
|
|
|
1873 |
<a href="../src/gdevdevn.h">src/gdevdevn.h</a>,
|
|
|
1874 |
<a href="../src/gdevxcf.c">src/gdevxcf.c</a>,
|
|
|
1875 |
<a href="../src/gdevpsd.c">src/gdevpsd.c</a>,
|
|
|
1876 |
<a href="../src/gdevperm.c">src/gdevperm.c</a>.
|
|
|
1877 |
|
|
|
1878 |
<dt>
|
|
|
1879 |
Other raster file formats:
|
|
|
1880 |
<dd>
|
|
|
1881 |
<a href="../src/gdevbit.c">src/gdevbit.c</a>,
|
|
|
1882 |
<a href="../src/gdevbmp.c">src/gdevbmp.c</a>,
|
|
|
1883 |
<a href="../src/gdevbmp.h">src/gdevbmp.h</a>,
|
|
|
1884 |
<a href="../src/gdevbmpa.c">src/gdevbmpa.c</a>,
|
|
|
1885 |
<a href="../src/gdevbmpc.c">src/gdevbmpc.c</a>,
|
|
|
1886 |
<a href="../src/gdevjpeg.c">src/gdevjpeg.c</a>,
|
|
|
1887 |
<a href="../src/gdevmiff.c">src/gdevmiff.c</a>,
|
|
|
1888 |
<a href="../src/gdevp2up.c">src/gdevp2up.c</a>,
|
|
|
1889 |
<a href="../src/gdevpcx.c">src/gdevpcx.c</a>,
|
|
|
1890 |
<a href="../src/gdevpbm.c">src/gdevpbm.c</a>,
|
|
|
1891 |
<a href="../src/gdevpng.c">src/gdevpng.c</a>,
|
|
|
1892 |
<a href="../src/gdevpsim.c">src/gdevpsim.c</a>.
|
|
|
1893 |
|
|
|
1894 |
</dl>
|
|
|
1895 |
|
|
|
1896 |
<dt>
|
|
|
1897 |
Printer drivers:
|
|
|
1898 |
<dd>
|
|
|
1899 |
|
|
|
1900 |
<dl>
|
|
|
1901 |
|
|
|
1902 |
<dt>
|
|
|
1903 |
Operating system printer services:
|
|
|
1904 |
<dd>
|
|
|
1905 |
<a href="../src/gdevos2p.c">src/gdevos2p.c</a>,
|
|
|
1906 |
<a href="../src/gdevwpr2.c">src/gdevwpr2.c</a>,
|
|
|
1907 |
<a href="../src/gdevwprn.c">src/gdevwprn.c</a>.
|
|
|
1908 |
|
|
|
1909 |
<dt>
|
|
|
1910 |
H-P monochrome printers:
|
|
|
1911 |
<dd>
|
|
|
1912 |
<a href="../src/gdevdljm.c">src/gdevdljm.c</a>,
|
|
|
1913 |
<a href="../src/gdevdljm.h">src/gdevdljm.h</a>,
|
|
|
1914 |
<a href="../src/gdevdjet.c">src/gdevdjet.c</a>,
|
|
|
1915 |
<a href="../src/gdevlj56.c">src/gdevlj56.c</a>.
|
|
|
1916 |
|
|
|
1917 |
<dt>
|
|
|
1918 |
Other printers:
|
|
|
1919 |
<dd>
|
|
|
1920 |
<a href="../src/gdevatx.c">src/gdevatx.c</a>.
|
|
|
1921 |
|
|
|
1922 |
</dl>
|
|
|
1923 |
|
|
|
1924 |
</dl>
|
|
|
1925 |
|
|
|
1926 |
<h4><a name="Contributed_drivers"></a>Contributed drivers</h4>
|
|
|
1927 |
|
|
|
1928 |
<p>
|
|
|
1929 |
This list is likely to be incomplete and inaccurate: see <a
|
|
|
1930 |
href="../src/contrib.mak">src/contrib.mak</a> for the real one.
|
|
|
1931 |
|
|
|
1932 |
<dl>
|
|
|
1933 |
|
|
|
1934 |
<dt>
|
|
|
1935 |
Display and window system drivers:
|
|
|
1936 |
<dd>
|
|
|
1937 |
<a href="../src/gdev3b1.c">src/gdev3b1.c</a>,
|
|
|
1938 |
<a href="../src/gdevherc.c">src/gdevherc.c</a>,
|
|
|
1939 |
<a href="../src/gdevpe.c">src/gdevpe.c</a>,
|
|
|
1940 |
<a href="../src/gdevsnfb.c">src/gdevsnfb.c</a>,
|
|
|
1941 |
<a href="../src/gdevsun.c">src/gdevsun.c</a>.
|
|
|
1942 |
|
|
|
1943 |
<dt>
|
|
|
1944 |
Raster file output drivers:
|
|
|
1945 |
<dd>
|
|
|
1946 |
<a href="../src/gdevcfax.c">src/gdevcfax.c</a>,
|
|
|
1947 |
<a href="../src/gdevcif.c">src/gdevcif.c</a>,
|
|
|
1948 |
<a href="../src/gdevdfax.c">src/gdevdfax.c</a>,
|
|
|
1949 |
<a href="../src/gdevifno.c">src/gdevifno.c</a>,
|
|
|
1950 |
<a href="../src/gdevmgr.c">src/gdevmgr.c</a>,
|
|
|
1951 |
<a href="../src/gdevmgr.h">src/gdevmgr.h</a>,
|
|
|
1952 |
<a href="../src/gdevsgi.c">src/gdevsgi.c</a>,
|
|
|
1953 |
<a href="../src/gdevsgi.h">src/gdevsgi.h</a>,
|
|
|
1954 |
<a href="../src/gdevsunr.c">src/gdevsunr.c</a>.
|
|
|
1955 |
|
|
|
1956 |
<dt>
|
|
|
1957 |
Printer drivers:
|
|
|
1958 |
<dd>
|
|
|
1959 |
<a href="../lib/bj8.rpd">lib/bj8.rpd</a>,
|
|
|
1960 |
<a href="../lib/cbjc600.ppd">lib/cbjc600.ppd</a>,
|
|
|
1961 |
<a href="../lib/cbjc800.ppd">lib/cbjc800.ppd</a>,
|
|
|
1962 |
<a href="../src/gdev3852.c">src/gdev3852.c</a>,
|
|
|
1963 |
<a href="../src/gdev4081.c">src/gdev4081.c</a>,
|
|
|
1964 |
<a href="../src/gdev4693.c">src/gdev4693.c</a>,
|
|
|
1965 |
<a href="../src/gdev8510.c">src/gdev8510.c</a>,
|
|
|
1966 |
<a href="../src/gdevadmp.c">src/gdevadmp.c</a>,
|
|
|
1967 |
<a href="../src/gdevbj10.c">src/gdevbj10.c</a>,
|
|
|
1968 |
<a href="../src/gdevbjc.h">src/gdevbjc.h</a>,
|
|
|
1969 |
<a href="../src/gdevbjcl.c">src/gdevbjcl.c</a>,
|
|
|
1970 |
<a href="../src/gdevbjcl.h">src/gdevbjcl.h</a>,
|
|
|
1971 |
<a href="../src/gdevccr.c">src/gdevccr.c</a>,
|
|
|
1972 |
<a href="../src/gdevcdj.c">src/gdevcdj.c</a>,
|
|
|
1973 |
<a href="../src/gdevclj.c">src/gdevclj.c</a>,
|
|
|
1974 |
<a href="../src/gdevcljc.c">src/gdevcljc.c</a>,
|
|
|
1975 |
<a href="../src/gdevcp50.c">src/gdevcp50.c</a>,
|
|
|
1976 |
<a href="../src/gdevcslw.c">src/gdevcslw.c</a>,
|
|
|
1977 |
<a href="../src/gdevdjtc.c">src/gdevdjtc.c</a>,
|
|
|
1978 |
<a href="../src/gdevdm24.c">src/gdevdm24.c</a>,
|
|
|
1979 |
<a href="../src/gdevepsc.c">src/gdevepsc.c</a>,
|
|
|
1980 |
<a href="../src/gdevepsn.c">src/gdevepsn.c</a>,
|
|
|
1981 |
<a href="../src/gdevescp.c">src/gdevescp.c</a>,
|
|
|
1982 |
<a href="../src/gdevhl7x.c">src/gdevhl7x.c</a>,
|
|
|
1983 |
<a href="../src/gdevijs.c">src/gdevijs.c</a>,
|
|
|
1984 |
<a href="../src/gdevimgn.c">src/gdevimgn.c</a>,
|
|
|
1985 |
<a href="../src/gdevl31s.c">src/gdevl31s.c</a>,
|
|
|
1986 |
<a href="../src/gdevlbp8.c">src/gdevlbp8.c</a>,
|
|
|
1987 |
<a href="../src/gdevlp8k.c">src/gdevlp8k.c</a>,
|
|
|
1988 |
<a href="../src/gdevlxm.c">src/gdevlxm.c</a>,
|
|
|
1989 |
<a href="../src/gdevn533.c">src/gdevn533.c</a>,
|
|
|
1990 |
<a href="../src/gdevo182.c">src/gdevo182.c</a>,
|
|
|
1991 |
<a href="../src/gdevokii.c">src/gdevokii.c</a>,
|
|
|
1992 |
<a href="../src/gdevpcl.c">src/gdevpcl.c</a>,
|
|
|
1993 |
<a href="../src/gdevpcl.h">src/gdevpcl.h</a>,
|
|
|
1994 |
<a href="../src/gdevphex.c">src/gdevphex.c</a>,
|
|
|
1995 |
<a href="../src/gdevpjet.c">src/gdevpjet.c</a>,
|
|
|
1996 |
<a href="../src/gdevsj48.c">src/gdevsj48.c</a>,
|
|
|
1997 |
<a href="../src/gdevsppr.c">src/gdevsppr.c</a>,
|
|
|
1998 |
<a href="../src/gdevstc.c">src/gdevstc.c</a>,
|
|
|
1999 |
<a href="../src/gdevstc.h">src/gdevstc.h</a>,
|
|
|
2000 |
<a href="../src/gdevstc1.c">src/gdevstc1.c</a>,
|
|
|
2001 |
<a href="../src/gdevstc2.c">src/gdevstc2.c</a>,
|
|
|
2002 |
<a href="../src/gdevstc3.c">src/gdevstc3.c</a>,
|
|
|
2003 |
<a href="../src/gdevstc4.c">src/gdevstc4.c</a>,
|
|
|
2004 |
<a href="../src/gdevtknk.c">src/gdevtknk.c</a>,
|
|
|
2005 |
<a href="../src/gdevupd.c">src/gdevupd.c</a>.
|
|
|
2006 |
|
|
|
2007 |
<dt>
|
|
|
2008 |
The special <tt>rinkj</tt> high-quality inkjet driver:
|
|
|
2009 |
<dd>
|
|
|
2010 |
<a href="../src/gdevrinkj.c">src/gdevrinkj.c</a>,
|
|
|
2011 |
<a href="../src/gsequivc.c">src/gsequivc.c</a>,
|
|
|
2012 |
<a href="../src/gsequivc.h">src/gsequivc.h</a>,
|
|
|
2013 |
<a href="../src/rinkj/evenbetter-rll.c">src/rinkj/evenbetter-rll.c</a>,
|
|
|
2014 |
<a href="../src/rinkj/evenbetter-rll.h">src/rinkj/evenbetter-rll.h</a>,
|
|
|
2015 |
<a href="../src/rinkj/rinkj-byte-stream.c">src/rinkj/rinkj-byte-stream.c</a>,
|
|
|
2016 |
<a href="../src/rinkj/rinkj-byte-stream.h">src/rinkj/rinkj-byte-stream.h</a>,
|
|
|
2017 |
<a href="../src/rinkj/rinkj-config.c">src/rinkj/rinkj-config.c</a>,
|
|
|
2018 |
<a href="../src/rinkj/rinkj-config.h">src/rinkj/rinkj-config.h</a>,
|
|
|
2019 |
<a href="../src/rinkj/rinkj-device.c">src/rinkj/rinkj-device.c</a>,
|
|
|
2020 |
<a href="../src/rinkj/rinkj-device.h">src/rinkj/rinkj-device.h</a>,
|
|
|
2021 |
<a href="../src/rinkj/rinkj-dither.c">src/rinkj/rinkj-dither.c</a>,
|
|
|
2022 |
<a href="../src/rinkj/rinkj-dither.h">src/rinkj/rinkj-dither.h</a>,
|
|
|
2023 |
<a href="../src/rinkj/rinkj-epson870.c">src/rinkj/rinkj-epson870.c</a>,
|
|
|
2024 |
<a href="../src/rinkj/rinkj-epson870.h">src/rinkj/rinkj-epson870.h</a>,
|
|
|
2025 |
<a href="../src/rinkj/rinkj-screen-eb.c">src/rinkj/rinkj-screen-eb.c</a>,
|
|
|
2026 |
<a href="../src/rinkj/rinkj-screen-eb.h">src/rinkj/rinkj-screen-eb.h</a>,
|
|
|
2027 |
<a href="../lib/rinkj-2200-setup">lib/rinkj-2200-setup</a>.
|
|
|
2028 |
|
|
|
2029 |
</dl>
|
|
|
2030 |
|
|
|
2031 |
<h3><a name="PostScript_interpreter"></a>PostScript interpreter</h3>
|
|
|
2032 |
|
|
|
2033 |
<p>
|
|
|
2034 |
The PostScript interpreter is conceptually simple: in fact, an interpreter
|
|
|
2035 |
that could execute "3 4 add =" and print "7" was running 3 weeks after the
|
|
|
2036 |
first line of Ghostscript code was written. However, a number of
|
|
|
2037 |
considerations make the code large and complex.
|
|
|
2038 |
|
|
|
2039 |
<p>
|
|
|
2040 |
The interpreter is designed to run in environments with very limited memory.
|
|
|
2041 |
The main consequence of this is that it cannot allocate its stacks
|
|
|
2042 |
(dictionary, execution, operand) as ordinary arrays, since the
|
|
|
2043 |
user-specified stack size limit may be very large. Instead, it allocates
|
|
|
2044 |
them as a linked list of blocks. See below for more details.
|
|
|
2045 |
|
|
|
2046 |
<p>
|
|
|
2047 |
The interpreter must never cause a C runtime error that it cannot trap.
|
|
|
2048 |
Unfortunately, C implementations almost never provide the ability to trap
|
|
|
2049 |
stack overflow. In order to put a fixed bound on the C stack size, the
|
|
|
2050 |
interpreter never implements PostScript recursion by C recursion. This
|
|
|
2051 |
means that any C code that logically needs to call the interpreter must
|
|
|
2052 |
instead push a continuation (including all necessary state information) on
|
|
|
2053 |
the PostScript execution stack, followed by the PostScript object to be
|
|
|
2054 |
executed, and then <em>return</em> to the interpreter. (See <a
|
|
|
2055 |
href="../src/estack.h">src/estack.h</a> for more details about
|
|
|
2056 |
continuations.) Unfortunately, since PostScript Level 2 introduces streams
|
|
|
2057 |
whose data source can be a PostScript procedure, any code that reads or
|
|
|
2058 |
writes stream data must be prepared to suspend itself, storing all necessary
|
|
|
2059 |
state in a continuation. There are some places where this is extremely
|
|
|
2060 |
awkward, such as the scanner/parser.
|
|
|
2061 |
|
|
|
2062 |
<p>
|
|
|
2063 |
The use of continuations affects many places in the interpreter, and even
|
|
|
2064 |
some places in the graphics library. For example, when processing an image,
|
|
|
2065 |
one may need to call a PostScript procedure as part of mapping a CIE color
|
|
|
2066 |
to a device color. Ghostscript uses a variety of dodges to handle this: for
|
|
|
2067 |
example, in the case of CIE color mapping, all of the PostScript procedures
|
|
|
2068 |
are pre-sampled and the results cached. The Adobe implementation limits
|
|
|
2069 |
this kind of recursion to a fixed number of levels (5?): this would be
|
|
|
2070 |
another acceptable approach, but at this point it would require far more
|
|
|
2071 |
code restructuring than it would be worth.
|
|
|
2072 |
|
|
|
2073 |
<p>
|
|
|
2074 |
A significant amount of the PostScript language implementation is in fact
|
|
|
2075 |
written in PostScript. Writing in PostScript leverages the C code for
|
|
|
2076 |
multi-threading, garbage collection, error handling, continuations for
|
|
|
2077 |
streams, etc., etc.; also, we have found PostScript in general more concise
|
|
|
2078 |
and easier to debug than C, mostly because of memory management issues. So
|
|
|
2079 |
given the choice, we tended to implement a feature in PostScript if it
|
|
|
2080 |
worked primarily with PostScript data structures, wasn't heavily used
|
|
|
2081 |
(example: font loading), or if it interacted with the stream or other
|
|
|
2082 |
callback machinery (examples: ReusableFileDecode streams, resourceforall).
|
|
|
2083 |
Often we would add non-standard PostScript operators for functions that had
|
|
|
2084 |
to run faster or that did more C-like things, such as the media matching
|
|
|
2085 |
algorithm for setpagedevice.
|
|
|
2086 |
|
|
|
2087 |
|
|
|
2088 |
|
|
|
2089 |
<h4><a name="Main_program"></a>Main program</h4>
|
|
|
2090 |
|
|
|
2091 |
<p>
|
|
|
2092 |
The main program of the interpreter is normally invoked from the command
|
|
|
2093 |
line, but it has an API as well. In fact, it has two APIs: one that
|
|
|
2094 |
recognizes the existence of multiple "interpreter instances" (although it
|
|
|
2095 |
currently provides a default instance, which almost all clients use), and a
|
|
|
2096 |
completely different one designed for Windows DLLs. These should be unified
|
|
|
2097 |
as soon as possible, since there are two steadily growing incompatible
|
|
|
2098 |
bodies of client code.
|
|
|
2099 |
|
|
|
2100 |
<dl>
|
|
|
2101 |
|
|
|
2102 |
<dt>
|
|
|
2103 |
Files:
|
|
|
2104 |
<dd>
|
|
|
2105 |
<a href="../src/gs.c">src/gs.c</a>,
|
|
|
2106 |
<a href="../src/gserver.c">src/gserver.c</a>,
|
|
|
2107 |
<a href="../src/iccinit0.c">src/iccinit0.c</a>,
|
|
|
2108 |
<a href="../src/iinit.c">src/iinit.c</a>,
|
|
|
2109 |
<a href="../src/iinit.h">src/iinit.h</a>,
|
|
|
2110 |
<a href="../src/imain.c">src/imain.c</a>,
|
|
|
2111 |
<a href="../src/imain.h">src/imain.h</a>,
|
|
|
2112 |
<a href="../src/imainarg.c">src/imainarg.c</a>,
|
|
|
2113 |
<a href="../src/imainarg.h">src/imainarg.h</a>,
|
|
|
2114 |
<a href="../src/iminst.h">src/iminst.h</a>,
|
|
|
2115 |
<a href="../src/main.h">src/main.h</a>.
|
|
|
2116 |
|
|
|
2117 |
</dl>
|
|
|
2118 |
|
|
|
2119 |
<h4><a name="Data_structures"></a>Data structures</h4>
|
|
|
2120 |
|
|
|
2121 |
<p>
|
|
|
2122 |
The main data structures visible to the PostScript programmers are arrays,
|
|
|
2123 |
contexts, dictionaries, names, and stacks.
|
|
|
2124 |
|
|
|
2125 |
<p>
|
|
|
2126 |
Arrays have no unusual properties. See under <a href="#Refs">Refs</a> below
|
|
|
2127 |
for more information about how array elements are stored.
|
|
|
2128 |
|
|
|
2129 |
<p>
|
|
|
2130 |
Contexts are used to hold the interpreter state even in configurations that
|
|
|
2131 |
don't include the Display PostScript multiple context extension. Context
|
|
|
2132 |
switching is implemented by a complex cooperation of C and PostScript code.
|
|
|
2133 |
|
|
|
2134 |
<p>
|
|
|
2135 |
Dictionaries have two special properties worth noting:
|
|
|
2136 |
|
|
|
2137 |
<ul>
|
|
|
2138 |
|
|
|
2139 |
<li>They use an optimized storage representation if all the keys are names,
|
|
|
2140 |
which is almost always the case.
|
|
|
2141 |
|
|
|
2142 |
<li>They interact with a caching scheme used to accelerate name lookup in
|
|
|
2143 |
the interpreter.
|
|
|
2144 |
|
|
|
2145 |
</ul>
|
|
|
2146 |
|
|
|
2147 |
<p>
|
|
|
2148 |
Names are allocated in blocks. The characters and hash chains are stored
|
|
|
2149 |
separately from the lookup cache information, so that in the future, most of
|
|
|
2150 |
the former can be compiled into the executable and shared or put in ROM.
|
|
|
2151 |
(This is not actually done yet.)
|
|
|
2152 |
|
|
|
2153 |
<dl>
|
|
|
2154 |
|
|
|
2155 |
<dt>
|
|
|
2156 |
Contexts:
|
|
|
2157 |
<dd>
|
|
|
2158 |
<a href="../src/icontext.c">src/icontext.c</a>,
|
|
|
2159 |
<a href="../src/icontext.h">src/icontext.h</a>,
|
|
|
2160 |
<a href="../src/icstate.h">src/icstate.h</a>.
|
|
|
2161 |
|
|
|
2162 |
<dt>
|
|
|
2163 |
Dictionaries:
|
|
|
2164 |
<dd>
|
|
|
2165 |
<a href="../src/iddict.h">src/iddict.h</a>,
|
|
|
2166 |
<a href="../src/idict.h">src/idict.h</a>,
|
|
|
2167 |
<a href="../src/idict.c">src/idict.c</a>,
|
|
|
2168 |
<a href="../src/idictdef.h">src/idictdef.h</a>.
|
|
|
2169 |
|
|
|
2170 |
<dt>
|
|
|
2171 |
Names:
|
|
|
2172 |
<dd>
|
|
|
2173 |
<a href="../src/iname.c">src/iname.c</a>,
|
|
|
2174 |
<a href="../src/iname.h">src/iname.h</a>,
|
|
|
2175 |
<a href="../src/inamedef.h">src/inamedef.h</a>,
|
|
|
2176 |
<a href="../src/inameidx.h">src/inameidx.h</a>,
|
|
|
2177 |
<a href="../src/inames.h">src/inames.h</a>,
|
|
|
2178 |
<a href="../src/inamestr.h">src/inamestr.h</a>.
|
|
|
2179 |
|
|
|
2180 |
</dl>
|
|
|
2181 |
|
|
|
2182 |
<h4><a name="Stacks"></a>Stacks</h4>
|
|
|
2183 |
|
|
|
2184 |
<p>
|
|
|
2185 |
As mentioned above, each stack is allocated as a linked list of blocks.
|
|
|
2186 |
However, for reasonable performance, operators must normally be able to
|
|
|
2187 |
access their operands and produce their results using indexing rather than
|
|
|
2188 |
an access procedure. This is implemented by ensuring that all the operands
|
|
|
2189 |
of an operator are in the topmost block of the stack, using guard entries
|
|
|
2190 |
that cause an internal error if the condition isn't met. See <a
|
|
|
2191 |
href="../src/iostack.h">src/iostack.h</a> for more details.
|
|
|
2192 |
|
|
|
2193 |
<dl>
|
|
|
2194 |
|
|
|
2195 |
<dt>
|
|
|
2196 |
Generic stacks:
|
|
|
2197 |
<dd>
|
|
|
2198 |
<a href="../src/isdata.h">src/isdata.h</a>,
|
|
|
2199 |
<a href="../src/istack.c">src/istack.c</a>,
|
|
|
2200 |
<a href="../src/istack.h">src/istack.h</a>,
|
|
|
2201 |
<a href="../src/istkparm.h">src/istkparm.h</a>.
|
|
|
2202 |
|
|
|
2203 |
<dt>
|
|
|
2204 |
Specific stacks:
|
|
|
2205 |
<dd>
|
|
|
2206 |
|
|
|
2207 |
<dl>
|
|
|
2208 |
|
|
|
2209 |
<dt>
|
|
|
2210 |
Dictionary stack:
|
|
|
2211 |
<dd>
|
|
|
2212 |
<a href="../src/dstack.h">src/dstack.h</a>,
|
|
|
2213 |
<a href="../src/iddstack.h">src/iddstack.h</a>,
|
|
|
2214 |
<a href="../src/idsdata.h">src/idsdata.h</a>,
|
|
|
2215 |
<a href="../src/idstack.c">src/idstack.c</a>,
|
|
|
2216 |
<a href="../src/idstack.h">src/idstack.h</a>.
|
|
|
2217 |
|
|
|
2218 |
<dt>
|
|
|
2219 |
Execution stack:
|
|
|
2220 |
<dd>
|
|
|
2221 |
<a href="../src/estack.h">src/estack.h</a>,
|
|
|
2222 |
<a href="../src/iesdata.h">src/iesdata.h</a>,
|
|
|
2223 |
<a href="../src/iestack.h">src/iestack.h</a>.
|
|
|
2224 |
|
|
|
2225 |
<dt>
|
|
|
2226 |
Operand stack:
|
|
|
2227 |
<dd>
|
|
|
2228 |
<a href="../src/iosdata.h">src/iosdata.h</a>,
|
|
|
2229 |
<a href="../src/iostack.h">src/iostack.h</a>,
|
|
|
2230 |
<a href="../src/ostack.h">src/ostack.h</a>.
|
|
|
2231 |
|
|
|
2232 |
</dl>
|
|
|
2233 |
|
|
|
2234 |
</dl>
|
|
|
2235 |
|
|
|
2236 |
<h4><a name="Interpreter_loop"></a>Interpreter loop</h4>
|
|
|
2237 |
|
|
|
2238 |
<dl>
|
|
|
2239 |
|
|
|
2240 |
<dt>
|
|
|
2241 |
Files:
|
|
|
2242 |
<dd>
|
|
|
2243 |
<a href="../src/interp.c">src/interp.c</a>,
|
|
|
2244 |
<a href="../src/interp.h">src/interp.h</a>.
|
|
|
2245 |
|
|
|
2246 |
</dl>
|
|
|
2247 |
|
|
|
2248 |
<h4><a name="Scanning_parsing"></a>Scanning/parsing</h4>
|
|
|
2249 |
|
|
|
2250 |
<p>
|
|
|
2251 |
PostScript parsing consists essentially of token scanning, and is simple in
|
|
|
2252 |
principle. The scanner is complex because it must be able to suspend its
|
|
|
2253 |
operation at any time (i.e., between any two input characters) to allow an
|
|
|
2254 |
interpreter callout, if its input is coming from a procedure-based stream
|
|
|
2255 |
and the procedure must be called to provide more input data.
|
|
|
2256 |
|
|
|
2257 |
<dl>
|
|
|
2258 |
|
|
|
2259 |
<dt>
|
|
|
2260 |
Main scanner:
|
|
|
2261 |
<dd>
|
|
|
2262 |
<a href="../src/iscan.c">src/iscan.c</a>,
|
|
|
2263 |
<a href="../src/iscan.h">src/iscan.h</a>,
|
|
|
2264 |
<a href="../src/iscannum.c">src/iscannum.c</a>,
|
|
|
2265 |
<a href="../src/iscannum.h">src/iscannum.h</a>,
|
|
|
2266 |
<a href="../src/scanchar.h">src/scanchar.h</a>,
|
|
|
2267 |
<a href="../src/scantab.c">src/scantab.c</a>.
|
|
|
2268 |
|
|
|
2269 |
<dt>
|
|
|
2270 |
Binary tokens:
|
|
|
2271 |
<dd>
|
|
|
2272 |
<a href="../src/btoken.h">src/btoken.h</a>,
|
|
|
2273 |
<a href="../src/ibnum.c">src/ibnum.c</a>,
|
|
|
2274 |
<a href="../src/ibnum.h">src/ibnum.h</a>,
|
|
|
2275 |
<a href="../src/inobtokn.c">src/inobtokn.c</a>,
|
|
|
2276 |
<a href="../src/iscanbin.c">src/iscanbin.c</a>,
|
|
|
2277 |
<a href="../src/iscanbin.h">src/iscanbin.h</a>.
|
|
|
2278 |
|
|
|
2279 |
<dt>
|
|
|
2280 |
DSC parsing:
|
|
|
2281 |
<dd>
|
|
|
2282 |
<a href="../src/dscparse.c">src/dscparse.c</a>,
|
|
|
2283 |
<a href="../src/dscparse.h">src/dscparse.h</a>.
|
|
|
2284 |
|
|
|
2285 |
</dl>
|
|
|
2286 |
|
|
|
2287 |
<h4><a name="Standard_operators"></a>Standard operators</h4>
|
|
|
2288 |
|
|
|
2289 |
<dl>
|
|
|
2290 |
|
|
|
2291 |
<dt>
|
|
|
2292 |
Non-output-related:
|
|
|
2293 |
<dd>
|
|
|
2294 |
|
|
|
2295 |
<dl>
|
|
|
2296 |
|
|
|
2297 |
<dt>
|
|
|
2298 |
Filters:
|
|
|
2299 |
<dd>
|
|
|
2300 |
<a href="../src/ifilter.h">src/ifilter.h</a>,
|
|
|
2301 |
<a href="../src/ifilter2.h">src/ifilter2.h</a>,
|
|
|
2302 |
<a href="../src/ifrpred.h">src/ifrpred.h</a>,
|
|
|
2303 |
<a href="../src/ifwpred.h">src/ifwpred.h</a>,
|
|
|
2304 |
<a href="../src/istream.h">src/istream.h</a>,
|
|
|
2305 |
<a href="../src/zfbcp.c">src/zfbcp.c</a>,
|
|
|
2306 |
<a href="../src/zfdctd.c">src/zfdctd.c</a>,
|
|
|
2307 |
<a href="../src/zfdcte.c">src/zfdcte.c</a>,
|
|
|
2308 |
<a href="../src/zfdecode.c">src/zfdecode.c</a>,
|
|
|
2309 |
<a href="../src/zfilter.c">src/zfilter.c</a>,
|
|
|
2310 |
<a href="../src/zfilter2.c">src/zfilter2.c</a>,
|
|
|
2311 |
<a href="../src/zfilterx.c">src/zfilterx.c</a>,
|
|
|
2312 |
<a href="../src/zfjbig2.c">src/zfjbig2.c</a>,
|
|
|
2313 |
<a href="../src/zfjpx.c">src/zfjpx.c</a>,
|
|
|
2314 |
<a href="../src/zfmd5.c">src/zfmd5.c</a>,
|
|
|
2315 |
<a href="../src/zfarc4.c">src/zfarc4.c</a>,
|
|
|
2316 |
<a href="../src/zfproc.c">src/zfproc.c</a>,
|
|
|
2317 |
<a href="../src/zfrsd.c">src/zfrsd.c</a>,
|
|
|
2318 |
<a href="../src/zfzlib.c">src/zfzlib.c</a>.
|
|
|
2319 |
|
|
|
2320 |
<dt>
|
|
|
2321 |
File and stream I/O:
|
|
|
2322 |
<dd>
|
|
|
2323 |
<a href="../src/files.h">src/files.h</a>,
|
|
|
2324 |
<a href="../src/itoken.h">src/itoken.h</a>,
|
|
|
2325 |
<a href="../src/zbseq.c">src/zbseq.c</a>,
|
|
|
2326 |
<a href="../src/zdscpars.c">src/zdscpars.c</a>,
|
|
|
2327 |
<a href="../src/zfile.c">src/zfile.c</a>,
|
|
|
2328 |
<a href="../src/zfile1.c">src/zfile1.c</a>,
|
|
|
2329 |
<a href="../src/zfileio.c">src/zfileio.c</a>,
|
|
|
2330 |
<a href="../src/ztoken.c">src/ztoken.c</a>.
|
|
|
2331 |
|
|
|
2332 |
<dt>
|
|
|
2333 |
Data structures:
|
|
|
2334 |
<dd>
|
|
|
2335 |
<a href="../src/zarray.c">src/zarray.c</a>,
|
|
|
2336 |
<a href="../src/zdict.c">src/zdict.c</a>,
|
|
|
2337 |
<a href="../src/zgeneric.c">src/zgeneric.c</a>,
|
|
|
2338 |
<a href="../src/zpacked.c">src/zpacked.c</a>,
|
|
|
2339 |
<a href="../src/zstring.c">src/zstring.c</a>.
|
|
|
2340 |
|
|
|
2341 |
<dt>
|
|
|
2342 |
Functions:
|
|
|
2343 |
<dd>
|
|
|
2344 |
<a href="../src/ifunc.h">src/ifunc.h</a>,
|
|
|
2345 |
<a href="../src/zfunc.c">src/zfunc.c</a>,
|
|
|
2346 |
<a href="../src/zfunc0.c">src/zfunc0.c</a>,
|
|
|
2347 |
<a href="../src/zfunc3.c">src/zfunc3.c</a>,
|
|
|
2348 |
<a href="../src/zfunc4.c">src/zfunc4.c</a>,
|
|
|
2349 |
|
|
|
2350 |
<dt>
|
|
|
2351 |
Other:
|
|
|
2352 |
<dd>
|
|
|
2353 |
<a href="../src/ivmem2.h">src/ivmem2.h</a>,
|
|
|
2354 |
<a href="../src/zarith.c">src/zarith.c</a>,
|
|
|
2355 |
<a href="../src/zcontext.c">src/zcontext.c</a>,
|
|
|
2356 |
<a href="../src/zcontrol.c">src/zcontrol.c</a>,
|
|
|
2357 |
<a href="../src/zmath.c">src/zmath.c</a>,
|
|
|
2358 |
<a href="../src/zmatrix.c">src/zmatrix.c</a>,
|
|
|
2359 |
<a href="../src/zmisc.c">src/zmisc.c</a>,
|
|
|
2360 |
<a href="../src/zmisc1.c">src/zmisc1.c</a>,
|
|
|
2361 |
<a href="../src/zmisc2.c">src/zmisc2.c</a>,
|
|
|
2362 |
<a href="../src/zmisc3.c">src/zmisc3.c</a>,
|
|
|
2363 |
<a href="../src/zrelbit.c">src/zrelbit.c</a>,
|
|
|
2364 |
<a href="../src/zstack.c">src/zstack.c</a>,
|
|
|
2365 |
<a href="../src/ztype.c">src/ztype.c</a>,
|
|
|
2366 |
<a href="../src/zusparam.c">src/zusparam.c</a>,
|
|
|
2367 |
<a href="../src/zvmem.c">src/zvmem.c</a>,
|
|
|
2368 |
<a href="../src/zvmem2.c">src/zvmem2.c</a>.
|
|
|
2369 |
|
|
|
2370 |
</dl>
|
|
|
2371 |
|
|
|
2372 |
<dt>
|
|
|
2373 |
Output-related:
|
|
|
2374 |
<dd>
|
|
|
2375 |
|
|
|
2376 |
<dl>
|
|
|
2377 |
|
|
|
2378 |
<dt>
|
|
|
2379 |
Device management:
|
|
|
2380 |
<dd>
|
|
|
2381 |
<a href="../src/zdevcal.c">src/zdevcal.c</a>,
|
|
|
2382 |
<a href="../src/zdevice.c">src/zdevice.c</a>,
|
|
|
2383 |
<a href="../src/zdevice2.c">src/zdevice2.c</a>,
|
|
|
2384 |
<a href="../src/ziodev.c">src/ziodev.c</a>,
|
|
|
2385 |
<a href="../src/ziodev2.c">src/ziodev2.c</a>,
|
|
|
2386 |
<a href="../src/ziodevs.c">src/ziodevs.c</a>,
|
|
|
2387 |
<a href="../src/ziodevsc.c">src/ziodevsc.c</a>,
|
|
|
2388 |
<a href="../src/ziodevst.c">src/ziodevst.c</a>,
|
|
|
2389 |
<a href="../src/zmedia2.c">src/zmedia2.c</a>,
|
|
|
2390 |
<a href="../src/zdfilter.c">src/zdfilter.c</a>.
|
|
|
2391 |
|
|
|
2392 |
<dt>
|
|
|
2393 |
Fonts and text:
|
|
|
2394 |
<dd>
|
|
|
2395 |
<a href="../src/bfont.h">src/bfont.h</a>,
|
|
|
2396 |
<a href="../src/ccfont.h">src/ccfont.h</a>,
|
|
|
2397 |
<a href="../src/iccfont.c">src/iccfont.c</a>,
|
|
|
2398 |
<a href="../src/icfontab.c">src/icfontab.c</a>,
|
|
|
2399 |
<a href="../src/ichar.h">src/ichar.h</a>,
|
|
|
2400 |
<a href="../src/ichar1.h">src/ichar1.h</a>,
|
|
|
2401 |
<a href="../src/icharout.h">src/icharout.h</a>,
|
|
|
2402 |
<a href="../src/icid.h">src/icid.h</a>,
|
|
|
2403 |
<a href="../src/ifcid.h">src/ifcid.h</a>,
|
|
|
2404 |
<a href="../src/ifont.h">src/ifont.h</a>,
|
|
|
2405 |
<a href="../src/ifont1.h">src/ifont1.h</a>,
|
|
|
2406 |
<a href="../src/ifont2.h">src/ifont2.h</a>,
|
|
|
2407 |
<a href="../src/ifont42.h">src/ifont42.h</a>,
|
|
|
2408 |
<a href="../src/zbfont.c">src/zbfont.c</a>,
|
|
|
2409 |
<a href="../src/zcfont.c">src/zcfont.c</a>,
|
|
|
2410 |
<a href="../src/zchar.c">src/zchar.c</a>,
|
|
|
2411 |
<a href="../src/zchar1.c">src/zchar1.c</a>,
|
|
|
2412 |
<a href="../src/zchar2.c">src/zchar2.c</a>,
|
|
|
2413 |
<a href="../src/zchar32.c">src/zchar32.c</a>,
|
|
|
2414 |
<a href="../src/zchar42.c">src/zchar42.c</a>,
|
|
|
2415 |
<a href="../src/zchar42.h">src/zchar42.h</a>,
|
|
|
2416 |
<a href="../src/zcharout.c">src/zcharout.c</a>,
|
|
|
2417 |
<a href="../src/zcharx.c">src/zcharx.c</a>,
|
|
|
2418 |
<a href="../src/zcid.c">src/zcid.c</a>,
|
|
|
2419 |
<a href="../src/zcidtest.c">src/zcidtest.c</a>,
|
|
|
2420 |
<a href="../src/zfcid.c">src/zfcid.c</a>,
|
|
|
2421 |
<a href="../src/zfcid0.c">src/zfcid0.c</a>,
|
|
|
2422 |
<a href="../src/zfcid1.c">src/zfcid1.c</a>,
|
|
|
2423 |
<a href="../src/zfcmap.c">src/zfcmap.c</a>,
|
|
|
2424 |
<a href="../src/zfont.c">src/zfont.c</a>,
|
|
|
2425 |
<a href="../src/zfont0.c">src/zfont0.c</a>,
|
|
|
2426 |
<a href="../src/zfont1.c">src/zfont1.c</a>,
|
|
|
2427 |
<a href="../src/zfont2.c">src/zfont2.c</a>,
|
|
|
2428 |
<a href="../src/zfont32.c">src/zfont32.c</a>,
|
|
|
2429 |
<a href="../src/zfont42.c">src/zfont42.c</a>,
|
|
|
2430 |
<a href="../src/zfontenum.c">src/zfontenum.c</a>.
|
|
|
2431 |
|
|
|
2432 |
<dt>
|
|
|
2433 |
A bridge to the True Type bytecode interpreter:
|
|
|
2434 |
<dd>
|
|
|
2435 |
<a href="../src/gxttfb.c">src/gxttfb.c</a>,
|
|
|
2436 |
<a href="../src/gxttfb.h">src/gxttfb.h</a>,
|
|
|
2437 |
<a href="../src/ttfoutl.h">src/ttfoutl.h</a>,
|
|
|
2438 |
<a href="../src/ttfmain.c">src/ttfmain.c</a>,
|
|
|
2439 |
<a href="../src/ttfmemd.c">src/ttfmemd.c</a>,
|
|
|
2440 |
<a href="../src/ttfmemd.h">src/ttfmemd.h</a>,
|
|
|
2441 |
<a href="../src/ttfinp.c">src/ttfinp.c</a>,
|
|
|
2442 |
<a href="../src/ttfinp.h">src/ttfinp.h</a>.
|
|
|
2443 |
|
|
|
2444 |
<dt>
|
|
|
2445 |
A reduced True Type bytecode interpreter:
|
|
|
2446 |
<br><em>(this is based in part on the work of the Freetype Team and incorporates some code from
|
|
|
2447 |
the
|
|
|
2448 |
FreeType 1 project)</em>
|
|
|
2449 |
<dd>
|
|
|
2450 |
<a href="../src/ttfsfnt.h">src/ttfsfnt.h</a>,
|
|
|
2451 |
<a href="../src/ttcalc.c">src/ttcalc.c</a>,
|
|
|
2452 |
<a href="../src/ttcalc.h">src/ttcalc.h</a>,
|
|
|
2453 |
<a href="../src/ttcommon.h">src/ttcommon.h</a>,
|
|
|
2454 |
<a href="../src/ttconf.h">src/ttconf.h</a>,
|
|
|
2455 |
<a href="../src/ttconfig.h">src/ttconfig.h</a>,
|
|
|
2456 |
<a href="../src/ttinterp.c">src/ttinterp.c</a>,
|
|
|
2457 |
<a href="../src/ttinterp.h">src/ttinterp.h</a>,
|
|
|
2458 |
<a href="../src/ttload.c">src/ttload.c</a>,
|
|
|
2459 |
<a href="../src/ttload.h">src/ttload.h</a>,
|
|
|
2460 |
<a href="../src/ttmisc.h">src/ttmisc.h</a>,
|
|
|
2461 |
<a href="../src/ttobjs.c">src/ttobjs.c</a>,
|
|
|
2462 |
<a href="../src/ttobjs.h">src/ttobjs.h</a>,
|
|
|
2463 |
<a href="../src/tttables.h">src/tttables.h</a>,
|
|
|
2464 |
<a href="../src/tttype.h">src/tttype.h</a>,
|
|
|
2465 |
<a href="../src/tttypes.h">src/tttypes.h</a>.
|
|
|
2466 |
|
|
|
2467 |
<dt>
|
|
|
2468 |
Color, pattern, and halftone:
|
|
|
2469 |
<dd>
|
|
|
2470 |
<a href="../src/icie.h">src/icie.h</a>,
|
|
|
2471 |
<a href="../src/icolor.h">src/icolor.h</a>,
|
|
|
2472 |
<a href="../src/icremap.h">src/icremap.h</a>,
|
|
|
2473 |
<a href="../src/icsmap.h">src/icsmap.h</a>,
|
|
|
2474 |
<a href="../src/iht.h">src/iht.h</a>,
|
|
|
2475 |
<a href="../src/ipcolor.h">src/ipcolor.h</a>,
|
|
|
2476 |
<a href="../src/zcie.c">src/zcie.c</a>,
|
|
|
2477 |
<a href="../src/zcolor.c">src/zcolor.c</a>,
|
|
|
2478 |
<a href="../src/zcolor1.c">src/zcolor1.c</a>,
|
|
|
2479 |
<a href="../src/zcolor2.c">src/zcolor2.c</a>,
|
|
|
2480 |
<a href="../src/zcolor3.c">src/zcolor3.c</a>,
|
|
|
2481 |
<a href="../src/zcrd.c">src/zcrd.c</a>,
|
|
|
2482 |
<a href="../src/zcsdevn.c">src/zcsdevn.c</a>,
|
|
|
2483 |
<a href="../src/zcsindex.c">src/zcsindex.c</a>,
|
|
|
2484 |
<a href="../src/zcspixel.c">src/zcspixel.c</a>,
|
|
|
2485 |
<a href="../src/zcssepr.c">src/zcssepr.c</a>,
|
|
|
2486 |
<a href="../src/zicc.c">src/zicc.c</a>,
|
|
|
2487 |
<a href="../src/zhsb.c">src/zhsb.c</a>,
|
|
|
2488 |
<a href="../src/zht.c">src/zht.c</a>,
|
|
|
2489 |
<a href="../src/zht1.c">src/zht1.c</a>,
|
|
|
2490 |
<a href="../src/zht2.h">src/zht2.h</a>,
|
|
|
2491 |
<a href="../src/zht2.c">src/zht2.c</a>,
|
|
|
2492 |
<a href="../src/zpcolor.c">src/zpcolor.c</a>,
|
|
|
2493 |
<a href="../src/zshade.c">src/zshade.c</a>,
|
|
|
2494 |
<a href="../src/ztrans.c">src/ztrans.c</a>.
|
|
|
2495 |
|
|
|
2496 |
<dt>
|
|
|
2497 |
Images:
|
|
|
2498 |
<dd>
|
|
|
2499 |
<a href="../src/iimage.h">src/iimage.h</a>,
|
|
|
2500 |
<a href="../src/iimage2.h">src/iimage2.h</a>,
|
|
|
2501 |
<a href="../src/zimage.c">src/zimage.c</a>,
|
|
|
2502 |
<a href="../src/zimage2.c">src/zimage2.c</a>,
|
|
|
2503 |
<a href="../src/zimage3.c">src/zimage3.c</a>.
|
|
|
2504 |
|
|
|
2505 |
<dt>
|
|
|
2506 |
Other graphics:
|
|
|
2507 |
<dd>
|
|
|
2508 |
<a href="../src/igstate.h">src/igstate.h</a>,
|
|
|
2509 |
<a href="../src/zdpnext.c">src/zdpnext.c</a>,
|
|
|
2510 |
<a href="../src/zdps.c">src/zdps.c</a>,
|
|
|
2511 |
<a href="../src/zdps1.c">src/zdps1.c</a>,
|
|
|
2512 |
<a href="../src/zgstate.c">src/zgstate.c</a>,
|
|
|
2513 |
<a href="../src/zpaint.c">src/zpaint.c</a>,
|
|
|
2514 |
<a href="../src/zpath.c">src/zpath.c</a>,
|
|
|
2515 |
<a href="../src/zpath1.c">src/zpath1.c</a>,
|
|
|
2516 |
<a href="../src/zrop.c">src/zrop.c</a>,
|
|
|
2517 |
<a href="../src/ztrap.c">src/ztrap.c</a>,
|
|
|
2518 |
<a href="../src/zupath.c">src/zupath.c</a>.
|
|
|
2519 |
|
|
|
2520 |
</dl>
|
|
|
2521 |
|
|
|
2522 |
<dt>
|
|
|
2523 |
Operator support:
|
|
|
2524 |
<dd>
|
|
|
2525 |
<a href="../src/oparc.h">src/oparc.h</a>,
|
|
|
2526 |
<a href="../src/opcheck.h">src/opcheck.h</a>,
|
|
|
2527 |
<a href="../src/opdef.h">src/opdef.h</a>,
|
|
|
2528 |
<a href="../src/oper.h">src/oper.h</a>,
|
|
|
2529 |
<a href="../src/opextern.h">src/opextern.h</a>.
|
|
|
2530 |
|
|
|
2531 |
</dl>
|
|
|
2532 |
|
|
|
2533 |
<h4><a name="Non_standard_operators"></a>Non-standard operators</h4>
|
|
|
2534 |
|
|
|
2535 |
<p>
|
|
|
2536 |
The interpreter includes many non-standard operators. Most of these provide
|
|
|
2537 |
some part of the function of a standard operator, so that the standard
|
|
|
2538 |
operator itself can be implemented in PostScript: these are not of interest
|
|
|
2539 |
to users, and their function is usually obvious from the way they are used.
|
|
|
2540 |
However, some non-standard operators provide access to additional,
|
|
|
2541 |
non-standard facilities that users might want to know about, such as
|
|
|
2542 |
transparency, RasterOp, and in-memory rendering. These are documented at <a
|
|
|
2543 |
href="Language.htm#Additional_operators">Language.htm#Additional_operators</a>.
|
|
|
2544 |
|
|
|
2545 |
<p>
|
|
|
2546 |
We don't document the complete set of non-standard operators here, because
|
|
|
2547 |
the set changes frequently. However, all non-standard operators are
|
|
|
2548 |
supposed to have names that begin with '.', so you can find them all by
|
|
|
2549 |
executing the following (Unix) command:
|
|
|
2550 |
|
|
|
2551 |
<blockquote><pre>
|
|
|
2552 |
grep '{".[.]' src/[zi]*.c
|
|
|
2553 |
</pre></blockquote>
|
|
|
2554 |
|
|
|
2555 |
<p>
|
|
|
2556 |
In addition to individual non-standard operators implemented in the same
|
|
|
2557 |
files as standard ones, there are several independent optional packages of
|
|
|
2558 |
non-standard operators. As with other non-standard operators, the names of
|
|
|
2559 |
all the operators in these packages begin with '.'. We list those packages
|
|
|
2560 |
here.
|
|
|
2561 |
|
|
|
2562 |
<dl>
|
|
|
2563 |
|
|
|
2564 |
<dt>
|
|
|
2565 |
<a href="../src/zdosio.c">src/zdosio.c</a>
|
|
|
2566 |
<dd>
|
|
|
2567 |
Provides access to PC hardware I/O through MS-DOS system calls. Probably no
|
|
|
2568 |
longer useful.
|
|
|
2569 |
|
|
|
2570 |
<dt>
|
|
|
2571 |
<a href="../src/zdouble.c">src/zdouble.c</a>
|
|
|
2572 |
<dd>
|
|
|
2573 |
Provides "double" floating point arithmetic, using 8-byte strings to hold
|
|
|
2574 |
values. Developed under a contract; probably used only by the group that
|
|
|
2575 |
funded the development.
|
|
|
2576 |
|
|
|
2577 |
<dt>
|
|
|
2578 |
<a href="../src/zfsample.c">src/zfsample.c</a>,
|
|
|
2579 |
<dd>
|
|
|
2580 |
Provides a special operator to sample a given function and create a new type 0 function.
|
|
|
2581 |
|
|
|
2582 |
<dt>
|
|
|
2583 |
<a href="../src/zsysvm.c">src/zsysvm.c</a>
|
|
|
2584 |
<dd>
|
|
|
2585 |
Provides operators for allocating objects in specific VM spaces,
|
|
|
2586 |
disregarding the current VM mode.
|
|
|
2587 |
|
|
|
2588 |
</dl>
|
|
|
2589 |
|
|
|
2590 |
<h4><a name="Interpreter_support"></a>Interpreter support</h4>
|
|
|
2591 |
|
|
|
2592 |
<p>
|
|
|
2593 |
Memory management (refs, GC, save/restore) -- see <a
|
|
|
2594 |
href="#PostScript_interpreter_extensions">below</a>.
|
|
|
2595 |
|
|
|
2596 |
<dl>
|
|
|
2597 |
<dt>
|
|
|
2598 |
Font API :
|
|
|
2599 |
<dd>
|
|
|
2600 |
<a href="../src/ifapi.h">src/ifapi.h</a>,
|
|
|
2601 |
<a href="../src/zfapi.c">src/zfapi.c</a>,
|
|
|
2602 |
<a href="../src/fapiufst.c">src/fapiufst.c</a>,
|
|
|
2603 |
<a href="../src/fapi_ft.c">src/fapi_ft.c</a>,
|
|
|
2604 |
<a href="../src/wrfont.h">src/wrfont.h</a>,
|
|
|
2605 |
<a href="../src/wrfont.c">src/wrfont.c</a>,
|
|
|
2606 |
<a href="../src/write_t1.h">src/write_t1.h</a>,
|
|
|
2607 |
<a href="../src/write_t1.c">src/write_t1.c</a>,
|
|
|
2608 |
<a href="../src/write_t2.h">src/write_t2.h</a>,
|
|
|
2609 |
<a href="../src/write_t2.c">src/write_t2.c</a>,
|
|
|
2610 |
|
|
|
2611 |
<dt>
|
|
|
2612 |
Miscellaneous support:
|
|
|
2613 |
<dd>
|
|
|
2614 |
<a href="../src/ierrors.h">src/ierrors.h</a>,
|
|
|
2615 |
<a href="../src/errors.h">src/errors.h</a> <em>(deprecated)</em>,
|
|
|
2616 |
<a href="../src/ghost.h">src/ghost.h</a>,
|
|
|
2617 |
<a href="../src/iconf.c">src/iconf.c</a>,
|
|
|
2618 |
<a href="../src/iconf.h">src/iconf.h</a>,
|
|
|
2619 |
<a href="../src/idparam.c">src/idparam.c</a>,
|
|
|
2620 |
<a href="../src/idparam.h">src/idparam.h</a>,
|
|
|
2621 |
<a href="../src/ilevel.h">src/ilevel.h</a>,
|
|
|
2622 |
<a href="../src/inouparm.c">src/inouparm.c</a>,
|
|
|
2623 |
<a href="../src/iparam.c">src/iparam.c</a>,
|
|
|
2624 |
<a href="../src/iparam.h">src/iparam.h</a>,
|
|
|
2625 |
<a href="../src/iparray.h">src/iparray.h</a>,
|
|
|
2626 |
<a href="../src/iutil.c">src/iutil.c</a>,
|
|
|
2627 |
<a href="../src/iutil.h">src/iutil.h</a>,
|
|
|
2628 |
<a href="../src/iutil2.c">src/iutil2.c</a>,
|
|
|
2629 |
<a href="../src/iutil2.h">src/iutil2.h</a>,
|
|
|
2630 |
<a href="../src/iutilasm.asm">src/iutilasm.asm</a>,
|
|
|
2631 |
<a href="../src/iplugin.c">src/iplugin.c</a>,
|
|
|
2632 |
<a href="../src/iplugin.h">src/iplugin.h</a>.
|
|
|
2633 |
|
|
|
2634 |
</dl>
|
|
|
2635 |
|
|
|
2636 |
<h4><a name="PostScript_code"></a>PostScript code</h4>
|
|
|
2637 |
|
|
|
2638 |
<dl>
|
|
|
2639 |
|
|
|
2640 |
<dt>
|
|
|
2641 |
Initialization and language support:
|
|
|
2642 |
<dd>
|
|
|
2643 |
|
|
|
2644 |
<dl>
|
|
|
2645 |
|
|
|
2646 |
<dt>
|
|
|
2647 |
All configurations:
|
|
|
2648 |
<dd>
|
|
|
2649 |
<a href="../lib/gs_init.ps">lib/gs_init.ps</a>,
|
|
|
2650 |
<a href="../lib/gs_statd.ps">lib/gs_statd.ps</a>.
|
|
|
2651 |
|
|
|
2652 |
<dt>
|
|
|
2653 |
Level 2:
|
|
|
2654 |
<dd>
|
|
|
2655 |
<a href="../lib/gs_btokn.ps">lib/gs_btokn.ps</a>,
|
|
|
2656 |
<a href="../lib/gs_dps1.ps">lib/gs_dps1.ps</a>,
|
|
|
2657 |
<a href="../lib/gs_dps2.ps">lib/gs_dps2.ps</a>,
|
|
|
2658 |
<a href="../lib/gs_lev2.ps">lib/gs_lev2.ps</a>,
|
|
|
2659 |
<a href="../lib/gs_res.ps">lib/gs_res.ps</a>,
|
|
|
2660 |
<a href="../lib/gs_resmp.ps">lib/gs_resmp.ps</a>,
|
|
|
2661 |
<a href="../lib/gs_resst.ps">lib/gs_resst.ps</a>,
|
|
|
2662 |
<a href="../lib/gs_stres.ps">lib/gs_stres.ps</a>,
|
|
|
2663 |
<a href="../lib/gs_setpd.ps">lib/gs_setpd.ps</a>.
|
|
|
2664 |
|
|
|
2665 |
<dt>
|
|
|
2666 |
LanguageLevel 3:
|
|
|
2667 |
<dd>
|
|
|
2668 |
<a href="../lib/gs_frsd.ps">lib/gs_frsd.ps</a>,
|
|
|
2669 |
<a href="../lib/gs_ll3.ps">lib/gs_ll3.ps</a>,
|
|
|
2670 |
<a href="../lib/gs_trap.ps">lib/gs_trap.ps</a>.
|
|
|
2671 |
|
|
|
2672 |
<dt>
|
|
|
2673 |
Display PostScript:
|
|
|
2674 |
<dd>
|
|
|
2675 |
<a href="../lib/gs_dpnxt.ps">lib/gs_dpnxt.ps</a>,
|
|
|
2676 |
<a href="../lib/gs_dps.ps">lib/gs_dps.ps</a>.
|
|
|
2677 |
|
|
|
2678 |
</dl>
|
|
|
2679 |
|
|
|
2680 |
<dt>
|
|
|
2681 |
Color Spaces and support:
|
|
|
2682 |
<dd>
|
|
|
2683 |
|
|
|
2684 |
<dl>
|
|
|
2685 |
|
|
|
2686 |
<dt>
|
|
|
2687 |
Color Space Loading:
|
|
|
2688 |
<dd>
|
|
|
2689 |
<a href="../lib/gs_ciecs2.ps">lib/gs_ciecs2.ps</a>,
|
|
|
2690 |
<a href="../lib/gs_ciecs3.ps">lib/gs_ciecs3.ps</a>,
|
|
|
2691 |
<a href="../lib/gs_cspace.ps">lib/gs_cspace.ps</a>,
|
|
|
2692 |
<a href="../lib/gs_devcs.ps">lib/gs_devcs.ps</a>,
|
|
|
2693 |
<a href="../lib/gs_devn.ps">lib/gs_devn.ps</a>,
|
|
|
2694 |
<a href="../lib/gs_devpxl.ps">lib/gs_devpxl.ps</a>,
|
|
|
2695 |
<a href="../lib/gs_indxd.ps">lib/gs_indxd.ps</a>,
|
|
|
2696 |
<a href="../lib/gs_patrn.ps">lib/gs_patrn.ps</a>,
|
|
|
2697 |
<a href="../lib/gs_sepr.ps">lib/gs_sepr.ps</a>.
|
|
|
2698 |
|
|
|
2699 |
<dt>
|
|
|
2700 |
ICC color profiles:
|
|
|
2701 |
<dd>
|
|
|
2702 |
<a href="../lib/gs_icc.ps">lib/gs_icc.ps</a>.
|
|
|
2703 |
|
|
|
2704 |
</dl>
|
|
|
2705 |
|
|
|
2706 |
<dt>
|
|
|
2707 |
Font loading and support:
|
|
|
2708 |
<dd>
|
|
|
2709 |
|
|
|
2710 |
<dl>
|
|
|
2711 |
|
|
|
2712 |
<dt>
|
|
|
2713 |
Font name mapping:
|
|
|
2714 |
<dd>
|
|
|
2715 |
<a href="../lib/Fontmap">lib/Fontmap</a>,
|
|
|
2716 |
<a href="../lib/Fontmap.ATB">lib/Fontmap.ATB</a>,
|
|
|
2717 |
<a href="../lib/Fontmap.ATM">lib/Fontmap.ATM</a>,
|
|
|
2718 |
<a href="../lib/Fontmap.GS">lib/Fontmap.GS</a>,
|
|
|
2719 |
<a href="../lib/Fontmap.OS2">lib/Fontmap.OS2</a>,
|
|
|
2720 |
<a href="../lib/Fontmap.OSF">lib/Fontmap.OSF</a>,
|
|
|
2721 |
<a href="../lib/Fontmap.SGI">lib/Fontmap.SGI</a>,
|
|
|
2722 |
<a href="../lib/Fontmap.Sol">lib/Fontmap.Sol</a>,
|
|
|
2723 |
<a href="../lib/Fontmap.Ult">lib/Fontmap.Ult</a>,
|
|
|
2724 |
<a href="../lib/Fontmap.VMS">lib/Fontmap.VMS</a>,
|
|
|
2725 |
<a href="../lib/cidfmap">lib/cidfmap</a>,
|
|
|
2726 |
<a href="../lib/FAPIcidfmap">lib/FAPIcidfmap</a>,
|
|
|
2727 |
<a href="../lib/FAPIfontmap">lib/FAPIfontmap</a>.
|
|
|
2728 |
|
|
|
2729 |
<dt>
|
|
|
2730 |
Generic:
|
|
|
2731 |
<dd>
|
|
|
2732 |
<a href="../lib/gs_ccfnt.ps">lib/gs_ccfnt.ps</a>,
|
|
|
2733 |
<a href="../lib/gs_fonts.ps">lib/gs_fonts.ps</a>,
|
|
|
2734 |
<a href="../lib/gs_fntem.ps">lib/gs_fntem.ps</a>.
|
|
|
2735 |
|
|
|
2736 |
<dt>
|
|
|
2737 |
Type 1 and CFF:
|
|
|
2738 |
<dd>
|
|
|
2739 |
<a href="../lib/gs_cff.ps">lib/gs_cff.ps</a>,
|
|
|
2740 |
<a href="../lib/gs_diskf.ps">lib/gs_diskf.ps</a>,
|
|
|
2741 |
<a href="../lib/gs_type1.ps">lib/gs_type1.ps</a>.
|
|
|
2742 |
|
|
|
2743 |
<dt>
|
|
|
2744 |
TrueType:
|
|
|
2745 |
<dd>
|
|
|
2746 |
<a href="../lib/gs_ttf.ps">lib/gs_ttf.ps</a>,
|
|
|
2747 |
<a href="../lib/gs_typ42.ps">lib/gs_typ42.ps</a>.
|
|
|
2748 |
|
|
|
2749 |
<dt>
|
|
|
2750 |
CID-keyed:
|
|
|
2751 |
<dd>
|
|
|
2752 |
<a href="../lib/gs_cidcm.ps">lib/gs_cidcm.ps</a>,
|
|
|
2753 |
<a href="../lib/gs_cidfn.ps">lib/gs_cidfn.ps</a>,
|
|
|
2754 |
<a href="../lib/gs_cmap.ps">lib/gs_cmap.ps</a>,
|
|
|
2755 |
<a href="../lib/gs_ciddc.ps">lib/gs_ciddc.ps</a>,
|
|
|
2756 |
<a href="../lib/gs_cidfm.ps">lib/gs_cidfm.ps</a>,
|
|
|
2757 |
<a href="../lib/gs_cidtt.ps">lib/gs_cidtt.ps</a>.
|
|
|
2758 |
|
|
|
2759 |
<dt>
|
|
|
2760 |
Font API:
|
|
|
2761 |
<dd>
|
|
|
2762 |
<a href="../lib/gs_fapi.ps">lib/gs_fapi.ps</a>,
|
|
|
2763 |
<a href="../lib/FAPIconfig">lib/FAPIconfig</a>,
|
|
|
2764 |
<a href="../lib/xlatmap">lib/xlatmap</a>.
|
|
|
2765 |
|
|
|
2766 |
<dt>
|
|
|
2767 |
Other:
|
|
|
2768 |
<dd>
|
|
|
2769 |
<a href="../lib/gs_kanji.ps">lib/gs_kanji.ps</a>,
|
|
|
2770 |
<a href="../lib/gs_pfile.ps">lib/gs_pfile.ps</a>,
|
|
|
2771 |
<a href="../lib/gs_typ32.ps">lib/gs_typ32.ps</a>.
|
|
|
2772 |
|
|
|
2773 |
</dl>
|
|
|
2774 |
|
|
|
2775 |
<dt>
|
|
|
2776 |
Encodings:
|
|
|
2777 |
<dd>
|
|
|
2778 |
|
|
|
2779 |
<dl>
|
|
|
2780 |
|
|
|
2781 |
<dt>
|
|
|
2782 |
Adobe-specified:
|
|
|
2783 |
<dd>
|
|
|
2784 |
<a href="../lib/gs_ce_e.ps">lib/gs_ce_e.ps</a>,
|
|
|
2785 |
<a href="../lib/gs_dbt_e.ps">lib/gs_dbt_e.ps</a>,
|
|
|
2786 |
<a href="../lib/gs_il1_e.ps">lib/gs_il1_e.ps</a>,
|
|
|
2787 |
<a href="../lib/gs_mex_e.ps">lib/gs_mex_e.ps</a>,
|
|
|
2788 |
<a href="../lib/gs_mro_e.ps">lib/gs_mro_e.ps</a>,
|
|
|
2789 |
<a href="../lib/gs_pdf_e.ps">lib/gs_pdf_e.ps</a>,
|
|
|
2790 |
<a href="../lib/gs_std_e.ps">lib/gs_std_e.ps</a>,
|
|
|
2791 |
<a href="../lib/gs_sym_e.ps">lib/gs_sym_e.ps</a>,
|
|
|
2792 |
<a href="../lib/gs_wan_e.ps">lib/gs_wan_e.ps</a>.
|
|
|
2793 |
|
|
|
2794 |
<dt>
|
|
|
2795 |
Additional:
|
|
|
2796 |
<dd>
|
|
|
2797 |
<a href="../lib/gs_il2_e.ps">lib/gs_il2_e.ps</a>,
|
|
|
2798 |
<a href="../lib/gs_ksb_e.ps">lib/gs_ksb_e.ps</a>,
|
|
|
2799 |
<a href="../lib/gs_wl1_e.ps">lib/gs_wl1_e.ps</a>,
|
|
|
2800 |
<a href="../lib/gs_wl2_e.ps">lib/gs_wl2_e.ps</a>,
|
|
|
2801 |
<a href="../lib/gs_wl5_e.ps">lib/gs_wl5_e.ps</a>.
|
|
|
2802 |
|
|
|
2803 |
<dt>
|
|
|
2804 |
Pseudo-encodings for internal use:
|
|
|
2805 |
<dd>
|
|
|
2806 |
<a href="../lib/gs_css_e.ps">lib/gs_css_e.ps</a>,
|
|
|
2807 |
<a href="../lib/gs_lgo_e.ps">lib/gs_lgo_e.ps</a>,
|
|
|
2808 |
<a href="../lib/gs_lgx_e.ps">lib/gs_lgx_e.ps</a>,
|
|
|
2809 |
<a href="../lib/gs_mgl_e.ps">lib/gs_mgl_e.ps</a>.
|
|
|
2810 |
|
|
|
2811 |
</dl>
|
|
|
2812 |
|
|
|
2813 |
<dt>
|
|
|
2814 |
Miscellaneous:
|
|
|
2815 |
<dd>
|
|
|
2816 |
|
|
|
2817 |
<dl>
|
|
|
2818 |
|
|
|
2819 |
<dt>
|
|
|
2820 |
Image support:
|
|
|
2821 |
<dd>
|
|
|
2822 |
<a href="../lib/gs_img.ps">lib/gs_img.ps</a>,
|
|
|
2823 |
|
|
|
2824 |
<dt>
|
|
|
2825 |
Emulation of %disk IODevice:
|
|
|
2826 |
<dd>
|
|
|
2827 |
<a href="../lib/gs_diskn.ps">lib/gs_diskn.ps</a>,
|
|
|
2828 |
|
|
|
2829 |
<dt>
|
|
|
2830 |
Other support:
|
|
|
2831 |
<dd>
|
|
|
2832 |
<a href="../lib/gs_agl.ps">lib/gs_agl.ps</a>,
|
|
|
2833 |
<a href="../lib/gs_dscp.ps">lib/gs_dscp.ps</a>,
|
|
|
2834 |
<a href="../lib/gs_epsf.ps">lib/gs_epsf.ps</a>,
|
|
|
2835 |
<a href="../lib/gs_pdfwr.ps">lib/gs_pdfwr.ps</a>,
|
|
|
2836 |
<a href="../lib/gs_rdlin.ps">lib/gs_rdlin.ps</a>.
|
|
|
2837 |
|
|
|
2838 |
<dt>
|
|
|
2839 |
X Windows icon bitmaps:
|
|
|
2840 |
<dd>
|
|
|
2841 |
<a href="../lib/gs_l.xbm">lib/gs_l.xbm</a>,
|
|
|
2842 |
<a href="../lib/gs_l.xpm">lib/gs_l.xpm</a>,
|
|
|
2843 |
<a href="../lib/gs_l_m.xbm">lib/gs_l_m.xbm</a>,
|
|
|
2844 |
<a href="../lib/gs_m.xbm">lib/gs_m.xbm</a>,
|
|
|
2845 |
<a href="../lib/gs_m.xpm">lib/gs_m.xpm</a>,
|
|
|
2846 |
<a href="../lib/gs_m_m.xbm">lib/gs_m_m.xbm</a>,
|
|
|
2847 |
<a href="../lib/gs_s.xbm">lib/gs_s.xbm</a>,
|
|
|
2848 |
<a href="../lib/gs_s.xpm">lib/gs_s.xpm</a>,
|
|
|
2849 |
<a href="../lib/gs_s_m.xbm">lib/gs_s_m.xbm</a>,
|
|
|
2850 |
<a href="../lib/gs_t.xbm">lib/gs_t.xbm</a>,
|
|
|
2851 |
<a href="../lib/gs_t.xpm">lib/gs_t.xpm</a>,
|
|
|
2852 |
<a href="../lib/gs_t_m.xbm">lib/gs_t_m.xbm</a>.
|
|
|
2853 |
|
|
|
2854 |
<dt>
|
|
|
2855 |
PDF/X-3 definition file sample :
|
|
|
2856 |
<dd>
|
|
|
2857 |
<a href="../lib/PDFX_def.ps">lib/PDFX_def.ps</a>,
|
|
|
2858 |
|
|
|
2859 |
<dt>
|
|
|
2860 |
Not currently used:
|
|
|
2861 |
<dd>
|
|
|
2862 |
<a href="../lib/gs_cmdl.ps">lib/gs_cmdl.ps</a>,
|
|
|
2863 |
<a href="../lib/gs_fform.ps">lib/gs_fform.ps</a>,
|
|
|
2864 |
<a href="../lib/gs_l2img.ps">lib/gs_l2img.ps</a>.
|
|
|
2865 |
|
|
|
2866 |
</dl>
|
|
|
2867 |
|
|
|
2868 |
</dl>
|
|
|
2869 |
|
|
|
2870 |
<h3><a name="PDF_interpreter"></a>PDF interpreter</h3>
|
|
|
2871 |
|
|
|
2872 |
<p>
|
|
|
2873 |
Ghostscript's PDF interpreter is written entirely in PostScript, because its
|
|
|
2874 |
data structures are the same as PostScript's, and it is much more convenient
|
|
|
2875 |
to manipulate PostScript-like data structures in PostScript than in C.
|
|
|
2876 |
There is definitely a performance cost, but apparently not a substantial
|
|
|
2877 |
one: we considered moving the main interpreter loop (read a token using
|
|
|
2878 |
slightly different syntax than PostScript, push it on the stack if literal,
|
|
|
2879 |
look it up in a special dictionary for execution if not) into C, but we did
|
|
|
2880 |
some profiling and discovered that this wasn't accounting for enough of the
|
|
|
2881 |
time to be worthwhile.
|
|
|
2882 |
|
|
|
2883 |
<p>
|
|
|
2884 |
Until recently, there was essentially no C code specifically for the purpose
|
|
|
2885 |
of supporting PDF interpretation. The one major exception is the PDF 1.4
|
|
|
2886 |
transparency features, which we (but not Adobe) have made available to
|
|
|
2887 |
PostScript code.
|
|
|
2888 |
|
|
|
2889 |
<p>
|
|
|
2890 |
In addition to patching the <b><tt>run</tt></b> operator to detect PDF
|
|
|
2891 |
files, the interpreter provides some procedures in <a
|
|
|
2892 |
href="../lib/pdf_main.ps">lib/pdf_main.ps</a> that are meant to be called
|
|
|
2893 |
from applications such as previewers.
|
|
|
2894 |
|
|
|
2895 |
<dl>
|
|
|
2896 |
|
|
|
2897 |
<dt>
|
|
|
2898 |
Files:
|
|
|
2899 |
<dd>
|
|
|
2900 |
<a href="../lib/pdf_base.ps">lib/pdf_base.ps</a>,
|
|
|
2901 |
<a href="../lib/pdf_draw.ps">lib/pdf_draw.ps</a>,
|
|
|
2902 |
<a href="../lib/pdf_font.ps">lib/pdf_font.ps</a>,
|
|
|
2903 |
<a href="../lib/pdf_main.ps">lib/pdf_main.ps</a>,
|
|
|
2904 |
<a href="../lib/pdf_rbld.ps">lib/pdf_rbld.ps</a>,
|
|
|
2905 |
<a href="../lib/pdf_ops.ps">lib/pdf_ops.ps</a>,
|
|
|
2906 |
<a href="../lib/pdf_sec.ps">lib/pdf_sec.ps</a>.
|
|
|
2907 |
|
|
|
2908 |
</dl>
|
|
|
2909 |
|
|
|
2910 |
<h3><a name="PPD"></a>PostScript Printer Description</h3>
|
|
|
2911 |
<p>
|
|
|
2912 |
A PostScript Printer Description tells a generic PostScript printer
|
|
|
2913 |
driver how to generate PostScript for a particular printer.
|
|
|
2914 |
Ghostscript includes a PPD file for generating PostScript
|
|
|
2915 |
intended to be converted to PDF. A Windows INF file for
|
|
|
2916 |
installing the PPD on Windows 2000 and XP is included.
|
|
|
2917 |
|
|
|
2918 |
<dl>
|
|
|
2919 |
|
|
|
2920 |
<dt>
|
|
|
2921 |
Files:
|
|
|
2922 |
<dd>
|
|
|
2923 |
<a href="../lib/ghostpdf.ppd">lib/ghostpdf.ppd</a>,
|
|
|
2924 |
<a href="../lib/ghostpdf.inf">lib/ghostpdf.inf</a>.
|
|
|
2925 |
|
|
|
2926 |
</dl>
|
|
|
2927 |
|
|
|
2928 |
<h3><a name="Build_process"></a>Build process</h3>
|
|
|
2929 |
|
|
|
2930 |
<h4><a name="Makefile_structure"></a>Makefile structure</h4>
|
|
|
2931 |
|
|
|
2932 |
<p>
|
|
|
2933 |
Ghostscript's makefiles embody a number of design decisions and assumptions
|
|
|
2934 |
that may not be obvious from a casual reading of the code.
|
|
|
2935 |
|
|
|
2936 |
<ul>
|
|
|
2937 |
|
|
|
2938 |
<li>All files are stored in subdirectories. The names of all subdirectories
|
|
|
2939 |
used in the build process are defined in the top-level makefiles for the
|
|
|
2940 |
various platforms: there are no "hard wired" directory names in any makefile
|
|
|
2941 |
rule. Subdirectory names in the makefiles are relative to the directory
|
|
|
2942 |
that is current at build time: normally this directory is the parent of the
|
|
|
2943 |
various subdirectories, and holds only a <b><tt>makefile</tt></b>, which in
|
|
|
2944 |
turn simply references the real top-level makefile in the source
|
|
|
2945 |
subdirectory.
|
|
|
2946 |
|
|
|
2947 |
<li>All compiler and linker switches are likewise defined by macros, again
|
|
|
2948 |
preferably in the top-level platform makefile.
|
|
|
2949 |
|
|
|
2950 |
<li>There is an absolute distinction between "source-like" subdirectories,
|
|
|
2951 |
which are read-only during the build process, and "object-like"
|
|
|
2952 |
subdirectories, all of whose contents are generated by the build process and
|
|
|
2953 |
which can be emptied (<b><tt>rm *</tt></b>) at any time with no bad
|
|
|
2954 |
effects. The source subdirectories are defined by macros named
|
|
|
2955 |
<b><tt>xxxSRCDIR</tt></b>.
|
|
|
2956 |
|
|
|
2957 |
<li>Object subdirectories may distinguish further between those that hold
|
|
|
2958 |
the results of the build process that are needed at run time (i.e., that
|
|
|
2959 |
should be included in a run-time distribution), defined by
|
|
|
2960 |
<b><tt>BINDIR</tt></b>, and those that are not needed at run time, defined
|
|
|
2961 |
by <b><tt>xxxGENDIR</tt></b> and <b><tt>xxxOBJDIR</tt></b>. (The
|
|
|
2962 |
distinction between these is historical and probably no longer relevant.)
|
|
|
2963 |
|
|
|
2964 |
<li>There may be multiple object subdirectories for different build
|
|
|
2965 |
configurations. On Unix, the <b><tt>obj</tt></b> and <b><tt>bin</tt></b>
|
|
|
2966 |
directories are used for normal production builds, the
|
|
|
2967 |
<b><tt>debugobj</tt></b> directory for debugging builds, and the
|
|
|
2968 |
<b><tt>pgobj</tt></b> directory for profiling builds; other platforms may
|
|
|
2969 |
use different conventions. The Unix makefiles support targets named
|
|
|
2970 |
<b><tt>debug</tt></b> and <b><tt>pg</tt></b> for debugging and profiling
|
|
|
2971 |
builds respectively; other platforms generally do not.
|
|
|
2972 |
|
|
|
2973 |
<li>Makefiles will be maintained by hand. This requires editing the
|
|
|
2974 |
following makefile elements whenever the relevant source files changes:
|
|
|
2975 |
|
|
|
2976 |
<ul>
|
|
|
2977 |
|
|
|
2978 |
<li>Every header (.h) file must have a corresponding macro definition in a
|
|
|
2979 |
makefile. If <b><tt>abc.h</tt></b> #includes <b><tt>def.h</tt></b> and
|
|
|
2980 |
<b><tt>xyz.h</tt></b>, the definition must have the form
|
|
|
2981 |
|
|
|
2982 |
<blockquote><pre>
|
|
|
2983 |
xyz_h=$(xxxSRCD)xyz.h $(def_h) $(xyz_h)
|
|
|
2984 |
</pre></blockquote>
|
|
|
2985 |
|
|
|
2986 |
where <b><tt>xxxSRCD</tt></b> is the macro defining the relevant source
|
|
|
2987 |
directory (including a trailing '/'). Note that the '.' in the file name
|
|
|
2988 |
has been replaced by an underscore. Note also that the definition must
|
|
|
2989 |
follow all definitions it references, since some <b><tt>make</tt></b>
|
|
|
2990 |
programs expand macros in definitions at the time of definition rather than
|
|
|
2991 |
at the time of use.
|
|
|
2992 |
|
|
|
2993 |
<li>Every .c file must have a corresponding rule in a makefile. If
|
|
|
2994 |
<b><tt>abc.c</tt></b> #includes <b><tt>def.h</tt></b> and
|
|
|
2995 |
<b><tt>lmn.h</tt></b>, the rule must have approximately the form
|
|
|
2996 |
|
|
|
2997 |
<blockquote><pre>
|
|
|
2998 |
$(xxxOBJD)abc.$(OBJ) : $(xxxSRCD)abc.c $(def_h) $(lmn_h)
|
|
|
2999 |
$(xxCC) $(xxO_)abc.$(OBJ) $(C_) $(xxxSRCD)abc.c
|
|
|
3000 |
</pre></blockquote>
|
|
|
3001 |
|
|
|
3002 |
where <b><tt>xxxSRCD</tt></b> is as before; <b><tt>xxxOBJD</tt></b> is the
|
|
|
3003 |
relevant object directory; <b><tt>xxCC</tt></b> defines the name of the C
|
|
|
3004 |
compiler plus the relevant compilation switches; and <b><tt>xxO_</tt></b>
|
|
|
3005 |
and <b><tt>C_</tt></b> are macros used to bridge syntactic differences
|
|
|
3006 |
between different <b><tt>make</tt></b> programs.
|
|
|
3007 |
|
|
|
3008 |
</ul>
|
|
|
3009 |
|
|
|
3010 |
</ul>
|
|
|
3011 |
|
|
|
3012 |
<p>
|
|
|
3013 |
The requirement to keep makefiles up to date by hand has been controversial.
|
|
|
3014 |
Two alternatives are generally proposed.
|
|
|
3015 |
|
|
|
3016 |
<ul>
|
|
|
3017 |
|
|
|
3018 |
<li>Programs like <b><tt>makedeps</tt></b>, which generate build rules
|
|
|
3019 |
automatically from the #include lists in C files. We have found such
|
|
|
3020 |
programs useless: they "wire in" specific, concrete directory names, not
|
|
|
3021 |
only for our own code but even for the system header files; they have to be
|
|
|
3022 |
run manually whenever code files are added, renamed, or deleted, or whenever
|
|
|
3023 |
the list of #includes in any file changes; and they cannot deal with
|
|
|
3024 |
different source files requiring different compilation switches.
|
|
|
3025 |
|
|
|
3026 |
<li>MSVC-style "project" files. These are equally useless: they are not
|
|
|
3027 |
portable across different vendors' tools -- in fact, there may not even be a
|
|
|
3028 |
usable import/export facility to convert their data to or from text form --
|
|
|
3029 |
and they cannot combine configuration-independent data with
|
|
|
3030 |
configuration-specific data.
|
|
|
3031 |
|
|
|
3032 |
</ul>
|
|
|
3033 |
|
|
|
3034 |
<p>
|
|
|
3035 |
We have seriously considered writing our own build program in Tcl or Python
|
|
|
3036 |
that would eliminate these problems, or perhaps porting the tools developed
|
|
|
3037 |
by Digital's Vesta research project (if we can get access to them); however,
|
|
|
3038 |
either of these approaches would create potential portability problems of
|
|
|
3039 |
its own, not to mention difficulties in integrating with others' build
|
|
|
3040 |
systems.
|
|
|
3041 |
|
|
|
3042 |
<p>
|
|
|
3043 |
For more information about makefiles:
|
|
|
3044 |
|
|
|
3045 |
<ul>
|
|
|
3046 |
|
|
|
3047 |
<li>For a detailed list of makefiles, and a discussion of makefile issues
|
|
|
3048 |
related to portability, see the <a href="#Makefiles">Makefiles</a> section
|
|
|
3049 |
below.
|
|
|
3050 |
|
|
|
3051 |
<li>For more detailed information about editing configuration information in
|
|
|
3052 |
makefiles, see <a
|
|
|
3053 |
href="Make.htm#Makefile_overview">doc/Make.htm#Makefile_overview</a>.
|
|
|
3054 |
|
|
|
3055 |
<li>For a complete example of adding a new driver to a makefile, see <a
|
|
|
3056 |
href="Drivers.htm#Adding_drivers">doc/Drivers.htm#Adding_drivers</a>.
|
|
|
3057 |
|
|
|
3058 |
<li>For a few more notes on makefile coding conventions, see <a
|
|
|
3059 |
href="C-style.htm#Makefiles">doc/C-style.htm#Makefiles</a>.
|
|
|
3060 |
|
|
|
3061 |
</ul>
|
|
|
3062 |
|
|
|
3063 |
<h4><a name="dev_files"></a>.dev files</h4>
|
|
|
3064 |
|
|
|
3065 |
<p>
|
|
|
3066 |
On top of the general conventions just described, Ghostscript's makefiles
|
|
|
3067 |
add a further layer of structure in order to support an open-ended set of
|
|
|
3068 |
fine-grained, flexible configuration options. Selecting an option (usually
|
|
|
3069 |
called a "module") for inclusion in the build may affect the build in many
|
|
|
3070 |
ways:
|
|
|
3071 |
|
|
|
3072 |
<ul>
|
|
|
3073 |
|
|
|
3074 |
<li>Almost always, it requires linking in some compiled code files.
|
|
|
3075 |
|
|
|
3076 |
<li>It may require running some additional initialization procedures at
|
|
|
3077 |
startup.
|
|
|
3078 |
|
|
|
3079 |
<li>It may require reading in some additional PostScript files at startup.
|
|
|
3080 |
For example, a Level 2 PostScript build requires support for PostScript
|
|
|
3081 |
resources and for setpagedevice, which are implemented in PostScript code.
|
|
|
3082 |
|
|
|
3083 |
<li>It may require adding entries to a variety of internal tables that
|
|
|
3084 |
catalogue such things as drivers, IODevices, Function types, etc.
|
|
|
3085 |
|
|
|
3086 |
<li>It may require that other particular modules be included. For example,
|
|
|
3087 |
the "PostScript Level 2" module requires the modules for various filters,
|
|
|
3088 |
color spaces, etc.
|
|
|
3089 |
|
|
|
3090 |
<li>It may require <em>removing</em> some other (default) module from the
|
|
|
3091 |
build. For example, the core (Level 1) PostScript build has a "stub" for
|
|
|
3092 |
binary tokens, which are a Level 2 feature but are referenced by the core
|
|
|
3093 |
scanner: a Level 2 build must remove the stub. For more information about
|
|
|
3094 |
this, look for the string <b><tt>-replace</tt></b> in the makefiles and in
|
|
|
3095 |
<a href="../src/genconf.c">src/genconf.c</a>.
|
|
|
3096 |
|
|
|
3097 |
</ul>
|
|
|
3098 |
|
|
|
3099 |
<p>
|
|
|
3100 |
Each module is defined in the makefiles by rules that create a file named
|
|
|
3101 |
<b><em>xxx</em><tt>.dev</tt></b>. The dependencies of the rule include all
|
|
|
3102 |
the files that make up the module (compiled code files, PostScript files,
|
|
|
3103 |
etc.); the body of the rule creates the .dev file by writing the description
|
|
|
3104 |
of the module into it. A program called <b><tt>genconf</tt></b>, described
|
|
|
3105 |
in the next section, merges all the relevant .dev files together. For
|
|
|
3106 |
examples of .dev rules, see any of the Ghostscript makefiles.
|
|
|
3107 |
|
|
|
3108 |
<p>
|
|
|
3109 |
Ultimately, a person must specify the root set of modules to include in a
|
|
|
3110 |
build (which of course may require other modules, recursively).
|
|
|
3111 |
Ghostscript's makefiles do this with a set of macros called
|
|
|
3112 |
<b><tt>FEATURE_DEVS</tt></b> and <b><tt>DEVICE_DEVS</tt>n</b>, defined in
|
|
|
3113 |
each top-level makefile, but nothing in the module machinery depends on
|
|
|
3114 |
this.
|
|
|
3115 |
|
|
|
3116 |
<h4><a name="Generators"></a>Generators</h4>
|
|
|
3117 |
|
|
|
3118 |
<p>
|
|
|
3119 |
Ghostscript's build procedure is somewhat unusual in that it compiles and
|
|
|
3120 |
then executes some support programs during the build process. These
|
|
|
3121 |
programs then generate data or source code that is used later on in the
|
|
|
3122 |
build.
|
|
|
3123 |
|
|
|
3124 |
<p>
|
|
|
3125 |
The most important and complex of the generator programs is
|
|
|
3126 |
<b><tt>genconf</tt></b>. <b><tt>genconf</tt></b> merges all the .dev files
|
|
|
3127 |
that make up the build, and creates three or more output files used in later
|
|
|
3128 |
stages:
|
|
|
3129 |
|
|
|
3130 |
<ul>
|
|
|
3131 |
|
|
|
3132 |
<li><b><tt>gconfig.h</tt></b>, consisting mainly of macro calls, one call
|
|
|
3133 |
per "resource" making up the build, other than "resources" listed in the
|
|
|
3134 |
other output files.
|
|
|
3135 |
|
|
|
3136 |
<li><b><tt>gconfigf.h</tt></b>, produced only for PostScript builds with
|
|
|
3137 |
compiled-in fonts, consisting of one macro call per font.
|
|
|
3138 |
|
|
|
3139 |
<li>A linker control file whose name varies from one platform to another,
|
|
|
3140 |
containing the list of compiled code files to be linked.
|
|
|
3141 |
|
|
|
3142 |
<li>If necessary, another linker control file, also varying between
|
|
|
3143 |
platforms, that contains other information for the linker such as the list
|
|
|
3144 |
of system libraries to be searched. (On Unix platforms, the two linker
|
|
|
3145 |
control functions are combined in a single file.)
|
|
|
3146 |
|
|
|
3147 |
</ul>
|
|
|
3148 |
|
|
|
3149 |
<dl>
|
|
|
3150 |
|
|
|
3151 |
<dt>
|
|
|
3152 |
Source generators:
|
|
|
3153 |
<dd>
|
|
|
3154 |
|
|
|
3155 |
<dl>
|
|
|
3156 |
|
|
|
3157 |
<dt>
|
|
|
3158 |
<a href="../src/genarch.c">src/genarch.c</a>
|
|
|
3159 |
<dd>
|
|
|
3160 |
Creates a header file containing a variety of information about the hardware
|
|
|
3161 |
and compiler that isn't provided in any standard system header file. Always
|
|
|
3162 |
used.
|
|
|
3163 |
|
|
|
3164 |
<dt>
|
|
|
3165 |
<a href="../src/genconf.c">src/genconf.c</a> (also generates non-source)
|
|
|
3166 |
<dd>
|
|
|
3167 |
Constructs header files and linker control files from the collection of
|
|
|
3168 |
options and modules that make up the build. See above. Always used.
|
|
|
3169 |
|
|
|
3170 |
<dt>
|
|
|
3171 |
<a href="../src/genht.c">src/genht.c</a>
|
|
|
3172 |
<dd>
|
|
|
3173 |
Converts a PostScript halftone (in a particular constrained format) to a C
|
|
|
3174 |
data structure that can be compiled into an executable. Only used if any
|
|
|
3175 |
such halftones are included in the build.
|
|
|
3176 |
|
|
|
3177 |
<dt>
|
|
|
3178 |
<a href="../src/geninit.c">src/geninit.c</a>
|
|
|
3179 |
<dd>
|
|
|
3180 |
Converts PostScript initialization files to C data structures that can be
|
|
|
3181 |
compiled into an executable. Only used when building a PostScript
|
|
|
3182 |
interpreter, and only if <b><tt>COMPILE_INITS</tt></b> was set to 1 in the
|
|
|
3183 |
makefile.
|
|
|
3184 |
|
|
|
3185 |
<dt>
|
|
|
3186 |
<a href="../src/mkromfs.c">src/mkromfs.c</a>
|
|
|
3187 |
<dd>
|
|
|
3188 |
Takes a set of directories, and creates a compressed filesystem
|
|
|
3189 |
image that can be compiled into the executable as static data and accessed
|
|
|
3190 |
through the %rom% iodevice prefix. Future: this will be used to implement the
|
|
|
3191 |
<b><tt>COMPILE_INITS=1</tt></b> feature (a compressed init fileset is more
|
|
|
3192 |
efficient than the current 'gsinit.c' produced by 'geninit.c'). This IODevice
|
|
|
3193 |
is more versatile since other files can be encapsulated such as fonts, helper
|
|
|
3194 |
PostScript files and Resources.
|
|
|
3195 |
|
|
|
3196 |
</dl>
|
|
|
3197 |
|
|
|
3198 |
<dt>
|
|
|
3199 |
Other generators:
|
|
|
3200 |
<dd>
|
|
|
3201 |
|
|
|
3202 |
<dl>
|
|
|
3203 |
|
|
|
3204 |
<dt>
|
|
|
3205 |
<a href="../src/echogs.c">src/echogs.c</a>
|
|
|
3206 |
<dd>
|
|
|
3207 |
Implements a variety of shell-like functions to get around quirks,
|
|
|
3208 |
limitations, and omissions in the shells on various platforms. Always used.
|
|
|
3209 |
|
|
|
3210 |
<dt>
|
|
|
3211 |
<a href="../src/genconf.c">src/genconf.c</a> (also generates source)
|
|
|
3212 |
<dd>
|
|
|
3213 |
See above.
|
|
|
3214 |
|
|
|
3215 |
<dt>
|
|
|
3216 |
<a href="../src/gendev.c">src/gendev.c</a> (not used)
|
|
|
3217 |
<dd>
|
|
|
3218 |
Was intended as a replacement for <b><tt>genconf</tt></b>, but was never
|
|
|
3219 |
completed.
|
|
|
3220 |
|
|
|
3221 |
</dl>
|
|
|
3222 |
|
|
|
3223 |
</dl>
|
|
|
3224 |
|
|
|
3225 |
<h4><a name="Build_support"></a>Support</h4>
|
|
|
3226 |
|
|
|
3227 |
<p>
|
|
|
3228 |
There are a number of programs, scripts, and configuration files that exist
|
|
|
3229 |
only for the sake of the build process.
|
|
|
3230 |
|
|
|
3231 |
<dl>
|
|
|
3232 |
|
|
|
3233 |
<dt>
|
|
|
3234 |
Files for PC environments:
|
|
|
3235 |
<dd>
|
|
|
3236 |
<a href="../src/gswin.icx">src/gswin.icx</a>,
|
|
|
3237 |
<a href="../src/gswin16.icx">src/gswin16.icx</a>,
|
|
|
3238 |
<a href="../src/bcc32.cfg">src/bcc32.cfg</a>,
|
|
|
3239 |
<a href="../src/cp.bat">src/cp.bat</a>,
|
|
|
3240 |
<a href="../src/cp.cmd">src/cp.cmd</a>,
|
|
|
3241 |
<a href="../src/dw32c.def">src/dw32c.def</a>,
|
|
|
3242 |
<a href="../src/dwmain.rc">src/dwmain.rc</a>,
|
|
|
3243 |
<a href="../src/dwmain16.def">src/dwmain16.def</a>,
|
|
|
3244 |
<a href="../src/dwmain32.def">src/dwmain32.def</a>,
|
|
|
3245 |
<a href="../src/dwsetup.def">src/dwsetup.def</a>,
|
|
|
3246 |
<a href="../src/dwsetup.rc">src/dwsetup.rc</a>,
|
|
|
3247 |
<a href="../src/dwuninst.def">src/dwuninst.def</a>,
|
|
|
3248 |
<a href="../src/dwuninst.rc">src/dwuninst.rc</a>,
|
|
|
3249 |
<a href="../src/gs16spl.def">src/gs16spl.def</a>,
|
|
|
3250 |
<a href="../src/gs16spl.rc">src/gs16spl.rc</a>,
|
|
|
3251 |
<a href="../src/gsdll2.def">src/gsdll2.def</a>,
|
|
|
3252 |
<a href="../src/gsdll2.rc">src/gsdll2.rc</a>,
|
|
|
3253 |
<a href="../src/gsdll32.def">src/gsdll32.def</a>,
|
|
|
3254 |
<a href="../src/gsdll32.rc">src/gsdll32.rc</a>,
|
|
|
3255 |
<a href="../src/gsdll32w.lnk">src/gsdll32w.lnk</a>,
|
|
|
3256 |
<a href="../src/gsos2.def">src/gsos2.def</a>,
|
|
|
3257 |
<a href="../src/gsos2.icx">src/gsos2.icx</a>,
|
|
|
3258 |
<a href="../src/gsos2.rc">src/gsos2.rc</a>,
|
|
|
3259 |
<a href="../src/gspmdrv.def">src/gspmdrv.def</a>,
|
|
|
3260 |
<a href="../src/gspmdrv.icx">src/gspmdrv.icx</a>,
|
|
|
3261 |
<a href="../src/gspmdrv.rc">src/gspmdrv.rc</a>,
|
|
|
3262 |
<a href="../src/gswin.rc">src/gswin.rc</a>,
|
|
|
3263 |
<a href="../src/gswin32.rc">src/gswin32.rc</a>,
|
|
|
3264 |
<a href="../src/gswin386.rc">src/gswin386.rc</a>,
|
|
|
3265 |
<a href="../src/mv.bat">src/mv.bat</a>,
|
|
|
3266 |
<a href="../src/mv.cmd">src/mv.cmd</a>,
|
|
|
3267 |
<a href="../src/rm.bat">src/rm.bat</a>,
|
|
|
3268 |
<a href="../src/rm.cmd">src/rm.cmd</a>,
|
|
|
3269 |
<a href="../src/turboc.cfg">src/turboc.cfg</a>.
|
|
|
3270 |
|
|
|
3271 |
<dt>
|
|
|
3272 |
Files for MacOS:
|
|
|
3273 |
<dd>
|
|
|
3274 |
<a href="../lib/Info-macos.plist">lib/Info-macos.plist</a>.
|
|
|
3275 |
|
|
|
3276 |
<dt>
|
|
|
3277 |
Files for OpenVMS:
|
|
|
3278 |
<dd>
|
|
|
3279 |
<a href="../src/append_l.com">src/append_l.com</a>,
|
|
|
3280 |
<a href="../src/copy_one.com">src/copy_one.com</a>,
|
|
|
3281 |
<a href="../src/rm_all.com">src/rm_all.com</a>,
|
|
|
3282 |
<a href="../src/rm_one.com">src/rm_one.com</a>.
|
|
|
3283 |
|
|
|
3284 |
<dt>
|
|
|
3285 |
Other files:
|
|
|
3286 |
<dd>
|
|
|
3287 |
<a href="../src/bench.c">src/bench.c</a>,
|
|
|
3288 |
<a href="../src/catmake">src/catmake</a>,
|
|
|
3289 |
<a href="../src/instcopy">src/instcopy</a>.
|
|
|
3290 |
|
|
|
3291 |
</dl>
|
|
|
3292 |
|
|
|
3293 |
<h3><a name="Utilities"></a>Utilities</h3>
|
|
|
3294 |
|
|
|
3295 |
<p>
|
|
|
3296 |
Ghostscript comes with many utilities for doing things like viewing bitmap
|
|
|
3297 |
files and converting between file formats. Some of these are written in
|
|
|
3298 |
PostScript, some as scripts, and some as scripts that invoke special
|
|
|
3299 |
PostScript code.
|
|
|
3300 |
|
|
|
3301 |
<h4><a name="Utilities_in_PostScript"></a>Utilities in PostScript</h4>
|
|
|
3302 |
|
|
|
3303 |
<p>
|
|
|
3304 |
These are all documented in <a href="Psfiles.htm">doc/Psfiles.htm</a>, q.v.
|
|
|
3305 |
|
|
|
3306 |
<h4><a name="Utility_scripts"></a>Utility scripts</h4>
|
|
|
3307 |
|
|
|
3308 |
<p>
|
|
|
3309 |
Many of these scripts come in both Unix and MS-DOS (<b><tt>.bat</tt></b>
|
|
|
3310 |
versions; some also have an OS/2 (<b><tt>.cmd</tt></b>) version. The choice
|
|
|
3311 |
of which versions are provided is historical and irregular. These scripts
|
|
|
3312 |
should all be documented somewhere, but currently, many of them have man
|
|
|
3313 |
pages, a few have their own documentation in the doc directory, and some
|
|
|
3314 |
aren't documented at all.
|
|
|
3315 |
|
|
|
3316 |
<dl>
|
|
|
3317 |
|
|
|
3318 |
<dt>
|
|
|
3319 |
Script files without PC versions:
|
|
|
3320 |
<dd>
|
|
|
3321 |
<a href="../lib/afmdiff.awk">lib/afmdiff.awk</a>,
|
|
|
3322 |
<a href="../lib/dvipdf">lib/dvipdf</a>,
|
|
|
3323 |
<a href="../lib/fixmswrd.pl">lib/fixmswrd.pl</a>,
|
|
|
3324 |
<a href="../lib/lprsetup.sh">lib/lprsetup.sh</a>,
|
|
|
3325 |
<a href="../lib/pj-gs.sh">lib/pj-gs.sh</a>,
|
|
|
3326 |
<a href="../lib/pphs">lib/pphs</a>,
|
|
|
3327 |
<a href="../lib/printafm">lib/printafm</a>,
|
|
|
3328 |
<a href="../lib/pv.sh">lib/pv.sh</a>,
|
|
|
3329 |
<a href="../lib/sysvlp.sh">lib/sysvlp.sh</a>,
|
|
|
3330 |
<a href="../lib/unix-lpr.sh">lib/unix-lpr.sh</a>,
|
|
|
3331 |
<a href="../lib/wftopfa">lib/wftopfa</a>.
|
|
|
3332 |
|
|
|
3333 |
<dt>
|
|
|
3334 |
Script files with PC versions:
|
|
|
3335 |
<dd>
|
|
|
3336 |
<a href="../lib/bdftops">lib/bdftops</a>,
|
|
|
3337 |
<a href="../lib/bdftops.bat">lib/bdftops.bat</a>,
|
|
|
3338 |
<a href="../lib/bdftops.cmd">lib/bdftops.cmd</a>,
|
|
|
3339 |
<a href="../lib/dumphint">lib/dumphint</a>,
|
|
|
3340 |
<a href="../lib/dumphint.bat">lib/dumphint.bat</a>,
|
|
|
3341 |
<a href="../lib/eps2eps">lib/eps2eps</a>,
|
|
|
3342 |
<a href="../lib/eps2eps.bat">lib/eps2eps.bat</a>,
|
|
|
3343 |
<a href="../lib/eps2eps.cmd">lib/eps2eps.cmd</a>,
|
|
|
3344 |
<a href="../lib/ps2write.bat">lib/ps2write.bat</a>,
|
|
|
3345 |
<a href="../lib/ps2write.cmd">lib/ps2write.cmd</a>,
|
|
|
3346 |
<a href="../lib/ps2ps2">lib/ps2ps2</a>,
|
|
|
3347 |
<a href="../lib/ps2ps2.bat">lib/ps2ps2.bat</a>,
|
|
|
3348 |
<a href="../lib/ps2ps2.cmd">lib/ps2ps2.cmd</a>,
|
|
|
3349 |
<a href="../lib/font2c">lib/font2c</a>,
|
|
|
3350 |
<a href="../lib/font2c.bat">lib/font2c.bat</a>,
|
|
|
3351 |
<a href="../lib/font2c.cmd">lib/font2c.cmd</a>,
|
|
|
3352 |
<a href="../lib/gsbj">lib/gsbj</a>,
|
|
|
3353 |
<a href="../lib/gsbj.bat">lib/gsbj.bat</a>,
|
|
|
3354 |
<a href="../lib/gsdj">lib/gsdj</a>,
|
|
|
3355 |
<a href="../lib/gsdj.bat">lib/gsdj.bat</a>,
|
|
|
3356 |
<a href="../lib/gsdj500">lib/gsdj500</a>,
|
|
|
3357 |
<a href="../lib/gsdj500.bat">lib/gsdj500.bat</a>,
|
|
|
3358 |
<a href="../lib/gslj">lib/gslj</a>,
|
|
|
3359 |
<a href="../lib/gslj.bat">lib/gslj.bat</a>,
|
|
|
3360 |
<a href="../lib/gslp">lib/gslp</a>,
|
|
|
3361 |
<a href="../lib/gslp.bat">lib/gslp.bat</a>,
|
|
|
3362 |
<a href="../lib/gsnd">lib/gsnd</a>,
|
|
|
3363 |
<a href="../lib/gsnd.bat">lib/gsnd.bat</a>,
|
|
|
3364 |
<a href="../lib/pdf2dsc">lib/pdf2dsc</a>,
|
|
|
3365 |
<a href="../lib/pdf2dsc.bat">lib/pdf2dsc.bat</a>,
|
|
|
3366 |
<a href="../lib/pdf2ps">lib/pdf2ps</a>,
|
|
|
3367 |
<a href="../lib/pdf2ps.bat">lib/pdf2ps.bat</a>,
|
|
|
3368 |
<a href="../lib/pdf2ps.cmd">lib/pdf2ps.cmd</a>,
|
|
|
3369 |
<a href="../lib/pdfopt">lib/pdfopt</a>,
|
|
|
3370 |
<a href="../lib/pdfopt.bat">lib/pdfopt.bat</a>,
|
|
|
3371 |
<a href="../lib/pf2afm">lib/pf2afm</a>,
|
|
|
3372 |
<a href="../lib/pf2afm.bat">lib/pf2afm.bat</a>,
|
|
|
3373 |
<a href="../lib/pf2afm.cmd">lib/pf2afm.cmd</a>,
|
|
|
3374 |
<a href="../lib/pfbtopfa">lib/pfbtopfa</a>,
|
|
|
3375 |
<a href="../lib/pfbtopfa.bat">lib/pfbtopfa.bat</a>,
|
|
|
3376 |
<a href="../lib/ps2ascii">lib/ps2ascii</a>,
|
|
|
3377 |
<a href="../lib/ps2ascii.bat">lib/ps2ascii.bat</a>,
|
|
|
3378 |
<a href="../lib/ps2ascii.cmd">lib/ps2ascii.cmd</a>,
|
|
|
3379 |
<a href="../lib/ps2epsi">lib/ps2epsi</a>,
|
|
|
3380 |
<a href="../lib/ps2epsi.bat">lib/ps2epsi.bat</a>,
|
|
|
3381 |
<a href="../lib/ps2epsi.cmd">lib/ps2epsi.cmd</a>,
|
|
|
3382 |
<a href="../lib/ps2pdf">lib/ps2pdf</a>,
|
|
|
3383 |
<a href="../lib/ps2pdf.bat">lib/ps2pdf.bat</a>,
|
|
|
3384 |
<a href="../lib/ps2pdf.cmd">lib/ps2pdf.cmd</a>,
|
|
|
3385 |
<a href="../lib/ps2pdf12">lib/ps2pdf12</a>,
|
|
|
3386 |
<a href="../lib/ps2pdf12.bat">lib/ps2pdf12.bat</a>,
|
|
|
3387 |
<a href="../lib/ps2pdf12.cmd">lib/ps2pdf12.cmd</a>,
|
|
|
3388 |
<a href="../lib/ps2pdf13">lib/ps2pdf13</a>,
|
|
|
3389 |
<a href="../lib/ps2pdf13.bat">lib/ps2pdf13.bat</a>,
|
|
|
3390 |
<a href="../lib/ps2pdf13.cmd">lib/ps2pdf13.cmd</a>,
|
|
|
3391 |
<a href="../lib/ps2pdf14">lib/ps2pdf14</a>,
|
|
|
3392 |
<a href="../lib/ps2pdf14.bat">lib/ps2pdf14.bat</a>,
|
|
|
3393 |
<a href="../lib/ps2pdf14.cmd">lib/ps2pdf14.cmd</a>,
|
|
|
3394 |
<a href="../lib/ps2pdfwr">lib/ps2pdfwr</a>,
|
|
|
3395 |
<a href="../lib/ps2pdfxx.bat">lib/ps2pdfxx.bat</a>,
|
|
|
3396 |
<a href="../lib/ps2ps">lib/ps2ps</a>,
|
|
|
3397 |
<a href="../lib/ps2ps.bat">lib/ps2ps.bat</a>,
|
|
|
3398 |
<a href="../lib/ps2ps.cmd">lib/ps2ps.cmd</a>.
|
|
|
3399 |
|
|
|
3400 |
<dt>
|
|
|
3401 |
Script files with only PC versions:
|
|
|
3402 |
<dd>
|
|
|
3403 |
<a href="../lib/gsndt.bat">lib/gsndt.bat</a>,
|
|
|
3404 |
<a href="../lib/gssetgs.bat">lib/gssetgs.bat</a>,
|
|
|
3405 |
<a href="../lib/gst.bat">lib/gst.bat</a>,
|
|
|
3406 |
<a href="../lib/gstt.bat">lib/gstt.bat</a>,
|
|
|
3407 |
<a href="../lib/lp386.bat">lib/lp386.bat</a>,
|
|
|
3408 |
<a href="../lib/lp386r2.bat">lib/lp386r2.bat</a>,
|
|
|
3409 |
<a href="../lib/lpgs.bat">lib/lpgs.bat</a>,
|
|
|
3410 |
<a href="../lib/lpr2.bat">lib/lpr2.bat</a>,
|
|
|
3411 |
<a href="../lib/pftogsf.bat">lib/pftogsf.bat</a>,
|
|
|
3412 |
<a href="../lib/wmakebat.bat">lib/wmakebat.bat</a>.
|
|
|
3413 |
|
|
|
3414 |
</dl>
|
|
|
3415 |
|
|
|
3416 |
<hr>
|
|
|
3417 |
|
|
|
3418 |
<h2><a name="Memory_management"></a>Memory management</h2>
|
|
|
3419 |
|
|
|
3420 |
<h3><a name="Memory_manager_architecture"></a>Memory manager architecture</h3>
|
|
|
3421 |
|
|
|
3422 |
<p>
|
|
|
3423 |
In many environments, the memory manager is a set of library facilities that
|
|
|
3424 |
implicitly manage the entire address space in a homogenous manner.
|
|
|
3425 |
Ghostscript's memory manager architecture has none of these properties:
|
|
|
3426 |
|
|
|
3427 |
<ul>
|
|
|
3428 |
|
|
|
3429 |
<li>Rather than a single library accessed as procedures, Ghostscript
|
|
|
3430 |
includes multiple allocator types, each of which in turn may have multiple
|
|
|
3431 |
instances (allocators). Allocators are 'objects' with a substantial set of
|
|
|
3432 |
virtual functions.
|
|
|
3433 |
|
|
|
3434 |
<li>Rather than managing the entire address space, each allocator manages a
|
|
|
3435 |
storage pool, which it may or may not be able to expand or reduce by calling
|
|
|
3436 |
on a 'parent' allocator.
|
|
|
3437 |
|
|
|
3438 |
<li>Rather than a single genus of untyped storage blocks, Ghostscript's
|
|
|
3439 |
allocators provide two genera -- type-tagged 'objects', and 'strings' --
|
|
|
3440 |
with substantially different properties.
|
|
|
3441 |
|
|
|
3442 |
</ul>
|
|
|
3443 |
|
|
|
3444 |
<h4><a name="Objects_vs_strings"></a>Objects vs strings</h4>
|
|
|
3445 |
|
|
|
3446 |
<p>
|
|
|
3447 |
As noted above, allocators provide two different storage genera.
|
|
|
3448 |
|
|
|
3449 |
<p>
|
|
|
3450 |
Objects:
|
|
|
3451 |
|
|
|
3452 |
<ul>
|
|
|
3453 |
<li>Are aligned in storage to satisfy the most stringent alignment
|
|
|
3454 |
requirement imposed by the CPU or compiler;
|
|
|
3455 |
<li>Can be referenced only by pointers to their start, not to any internal
|
|
|
3456 |
location, unless special arrangements are made;
|
|
|
3457 |
<li>May contain pointers to other objects, or to strings;
|
|
|
3458 |
<li>Have an associated <em>structure descriptor</em> that specifies their
|
|
|
3459 |
size (usually) and the location of any pointers contained within them.
|
|
|
3460 |
</ul>
|
|
|
3461 |
|
|
|
3462 |
<p>
|
|
|
3463 |
Given a pointer to an object, the allocator that allocated it must be able
|
|
|
3464 |
to return the object's size and the pointer to its structure descriptor.
|
|
|
3465 |
(It is up to the client to know what allocator allocated an object.)
|
|
|
3466 |
|
|
|
3467 |
<p>
|
|
|
3468 |
Strings:
|
|
|
3469 |
|
|
|
3470 |
<ul>
|
|
|
3471 |
<li>Are not aligned in storage;
|
|
|
3472 |
<li>Can be referenced by pointers (consisting of a starting address and a
|
|
|
3473 |
length) to any substring, starting anywhere within the string;
|
|
|
3474 |
<li>May not contain pointers;
|
|
|
3475 |
<li>Do not have a structure descriptor.
|
|
|
3476 |
</ul>
|
|
|
3477 |
|
|
|
3478 |
<p>
|
|
|
3479 |
The object/string distinction reflects a space/capability tradeoff. The
|
|
|
3480 |
per-object space overhead of the standard type of allocator is typically 12
|
|
|
3481 |
bytes; this is too much to impose on every string of a few bytes. On the
|
|
|
3482 |
other hand, restricting object pointers to reference the start of the object
|
|
|
3483 |
currently makes object garbage collection and compaction more
|
|
|
3484 |
space-efficient. If we were to redesign the standard allocator, we would
|
|
|
3485 |
probably opt for a different design in which strings were allocated within
|
|
|
3486 |
container objects of a few hundred bytes, and pointers into the middle of
|
|
|
3487 |
all objects were allowed.
|
|
|
3488 |
|
|
|
3489 |
<h4><a name="Structure_descriptors"></a>Structure descriptors</h4>
|
|
|
3490 |
|
|
|
3491 |
<p>
|
|
|
3492 |
Every object allocated by a Ghostscript allocator has an associated
|
|
|
3493 |
structure descriptor, which the caller provides when allocating the object.
|
|
|
3494 |
The structure descriptor serves several purposes:
|
|
|
3495 |
|
|
|
3496 |
<ul>
|
|
|
3497 |
<li>Specifying the size of the object for allocation;
|
|
|
3498 |
<li>Providing pointer-enumeration and pointer-relocation procedures for
|
|
|
3499 |
the garbage collector;
|
|
|
3500 |
<li>Providing an optional finalization procedure to be called when the
|
|
|
3501 |
object is freed (either explicitly or automatically).
|
|
|
3502 |
</ul>
|
|
|
3503 |
|
|
|
3504 |
<p>
|
|
|
3505 |
Structure descriptors are read-only, and are normally defined statically
|
|
|
3506 |
using one of the large set of <b><tt>gs_private_st_</tt></b> or
|
|
|
3507 |
<b><tt>gs_public_st_</tt></b> macros in <a
|
|
|
3508 |
href="../src/gsstruct.h">src/gsstruct.h</a>.
|
|
|
3509 |
|
|
|
3510 |
<p>
|
|
|
3511 |
While the structure descriptor normally specifies the size of the object,
|
|
|
3512 |
one can also allocate an array of bytes or objects, whose size is a multiple
|
|
|
3513 |
of the size in the descriptor. For this reason, every object stores its
|
|
|
3514 |
size as well as a reference to its descriptor.
|
|
|
3515 |
|
|
|
3516 |
<p>
|
|
|
3517 |
Because the standard Ghostscript garbage collector is non-conservative and
|
|
|
3518 |
can move objects, every object allocated by a Ghostscript allocator must
|
|
|
3519 |
have an accurate structure descriptor. If you define a new type of object
|
|
|
3520 |
(structure) that will be allocated in storage managed by Ghostscript, you
|
|
|
3521 |
<em>must</em> create an accurate descriptor for it, and use that descriptor
|
|
|
3522 |
to allocate it. The process of creating accurate descriptors for all
|
|
|
3523 |
structures was long and painful, and accounted for many hard-to-diagnose
|
|
|
3524 |
bugs.
|
|
|
3525 |
|
|
|
3526 |
<p>
|
|
|
3527 |
By convention, the structure descriptor for structure type
|
|
|
3528 |
<b><tt>xxx_t</tt></b> is named <b><tt>st_xxx</tt></b> (this is preferred),
|
|
|
3529 |
or occasionally <b><tt>st_xxx_t</tt></b>.
|
|
|
3530 |
|
|
|
3531 |
<p>
|
|
|
3532 |
Note that a structure descriptor is only required for objects allocated by
|
|
|
3533 |
the Ghostscript allocator. A structure type <b><tt>xxx_t</tt></b> does not
|
|
|
3534 |
require a structure descriptor if instances of that type are used
|
|
|
3535 |
<em>only</em> in the following ways:
|
|
|
3536 |
|
|
|
3537 |
<ul>
|
|
|
3538 |
|
|
|
3539 |
<li>Instances are allocated only on the C stack, e.g., as
|
|
|
3540 |
<b><tt>xxx_t xxx1, xxx2;</tt></b>, or on the C heap, with
|
|
|
3541 |
<b><tt>malloc</tt></b> or through the Ghostscript "wrapper" defined in <a
|
|
|
3542 |
href="../src/gsmalloc.h">src/gsmalloc.h</a>.
|
|
|
3543 |
|
|
|
3544 |
<li>Pointers to instances are not stored in places where the garbage
|
|
|
3545 |
collector will try to trace the pointer.
|
|
|
3546 |
|
|
|
3547 |
<li>Code never attempts to get the structure type or size of an instance
|
|
|
3548 |
through the allocator API.
|
|
|
3549 |
|
|
|
3550 |
</ul>
|
|
|
3551 |
|
|
|
3552 |
<p>
|
|
|
3553 |
In general, structures without descriptors are problem-prone, and are
|
|
|
3554 |
deprecated; in new code, they should only be used if the structure is
|
|
|
3555 |
confined to a single .c file and its instances are only allocated on the C
|
|
|
3556 |
stack.
|
|
|
3557 |
|
|
|
3558 |
<dl>
|
|
|
3559 |
<dt>
|
|
|
3560 |
Files:
|
|
|
3561 |
<dd>
|
|
|
3562 |
<a href="../src/gsstruct.h">src/gsstruct.h</a>,
|
|
|
3563 |
<a href="../src/gsstype.h">src/gsstype.h</a>.
|
|
|
3564 |
</dl>
|
|
|
3565 |
|
|
|
3566 |
<h4><a name="Garbage_collection"></a>Garbage collection</h4>
|
|
|
3567 |
|
|
|
3568 |
<p>
|
|
|
3569 |
The allocator architecture is designed to support compacting garbage
|
|
|
3570 |
collection. Every object must be able to enumerate all the pointers it
|
|
|
3571 |
contains, both for tracing and for relocation. As noted just above, the
|
|
|
3572 |
structure descriptor provides procedures that do this.
|
|
|
3573 |
|
|
|
3574 |
<p>
|
|
|
3575 |
Whether or not a particular allocator type actually provides a garbage
|
|
|
3576 |
collector is up to the allocator: garbage collection is invoked through a
|
|
|
3577 |
virtual procedure. In practice, however, there are only two useful garbage
|
|
|
3578 |
collectors for Ghostscript's own allocator:
|
|
|
3579 |
|
|
|
3580 |
<ul>
|
|
|
3581 |
<li>The "real" garbage collector associated with the PostScript interpreter,
|
|
|
3582 |
described <a href="#Interpreter_GC">below</a>;
|
|
|
3583 |
<li>A "non" garbage collector that only merges adjacent free blocks.
|
|
|
3584 |
</ul>
|
|
|
3585 |
|
|
|
3586 |
<p>
|
|
|
3587 |
As noted above, because the architecture supports compacting garbage
|
|
|
3588 |
collection, a "real" garbage collector cannot be run at arbitrary times,
|
|
|
3589 |
because it cannot reliably find and relocate pointers that are on the C
|
|
|
3590 |
stack. In general, it is only safe to run a "real" garbage collector when
|
|
|
3591 |
control is at the top level of the program, when there are no pointers to
|
|
|
3592 |
garbage collectable objects from the stack (other than designated roots).
|
|
|
3593 |
|
|
|
3594 |
<dl>
|
|
|
3595 |
<dt>
|
|
|
3596 |
Files:
|
|
|
3597 |
<dd>
|
|
|
3598 |
<a href="../src/gsgc.h">src/gsgc.h</a>,
|
|
|
3599 |
<a href="../src/gsnogc.c">src/gsnogc.c</a>,
|
|
|
3600 |
<a href="../src/gsnogc.h">src/gsnogc.h</a>.
|
|
|
3601 |
</dl>
|
|
|
3602 |
|
|
|
3603 |
<h4><a name="Movability"></a>Movability</h4>
|
|
|
3604 |
|
|
|
3605 |
<p>
|
|
|
3606 |
As just noted, objects are normally movable by the garbage collector.
|
|
|
3607 |
However, some objects must be immovable, usually because some other piece of
|
|
|
3608 |
software must retain pointers to them. The allocator API includes
|
|
|
3609 |
procedures for allocating both movable (default) and immovable objects.
|
|
|
3610 |
Note, however, that even immovable objects must be traceable (have a
|
|
|
3611 |
structure descriptor), and may be freed, by the garbage collector.
|
|
|
3612 |
|
|
|
3613 |
<h4><a name="Parent_hierarchy"></a>Parent hierarchy</h4>
|
|
|
3614 |
|
|
|
3615 |
<p>
|
|
|
3616 |
When an allocator needs to add memory to the pool that it manages, it
|
|
|
3617 |
requests the memory from its <em>parent</em> allocator. Every allocator has
|
|
|
3618 |
a pointer to its parent; multiple allocators may share a single parent. The
|
|
|
3619 |
ultimate ancestor of all allocators that can expand their pool dynamically
|
|
|
3620 |
is an allocator that calls <b><tt>malloc</tt></b>, described <a
|
|
|
3621 |
href="#malloc">below</a>. However, especially in embedded environments, an
|
|
|
3622 |
allocator may be limited to a fixed-size pool assigned to it when it is
|
|
|
3623 |
created.
|
|
|
3624 |
|
|
|
3625 |
<h4><a name="Allocator_API"></a>Allocator API</h4>
|
|
|
3626 |
|
|
|
3627 |
In summary, the allocator API provides the following principal operations:
|
|
|
3628 |
|
|
|
3629 |
<ul>
|
|
|
3630 |
<li>Allocate and free movable (default) or immovable objects and strings.
|
|
|
3631 |
<li>Return the structure type and size of an object.
|
|
|
3632 |
<li>Resize (shrink or grow) movable objects and strings, preserving
|
|
|
3633 |
the contents insofar as possible.
|
|
|
3634 |
<li>Report the size of the managed pool, and how much of it is in use.
|
|
|
3635 |
<li>Register and unregister root pointers for the garbage collector.
|
|
|
3636 |
<li>Free the allocator itself.
|
|
|
3637 |
<li>Consolidate adjacent free blocks to reduce fragmentation.
|
|
|
3638 |
</ul>
|
|
|
3639 |
|
|
|
3640 |
<p>
|
|
|
3641 |
For details, see <a href="../src/gsmemory.h">src/gsmemory.h</a>.
|
|
|
3642 |
|
|
|
3643 |
<p>
|
|
|
3644 |
The allocator API also includes one special hook for the PostScript
|
|
|
3645 |
interpreter: the concept of stable allocators. See the section on <a
|
|
|
3646 |
href="#save_forgetsave_restore"><b><tt>save</tt></b> and
|
|
|
3647 |
<b><tt>restore</tt></b></a> below for details.
|
|
|
3648 |
|
|
|
3649 |
<dl>
|
|
|
3650 |
<dt>
|
|
|
3651 |
Files:
|
|
|
3652 |
<dd>
|
|
|
3653 |
<a href="../src/gsmemraw.h">src/gsmemraw.h</a>,
|
|
|
3654 |
<a href="../src/gsmemory.c">src/gsmemory.c</a>,
|
|
|
3655 |
<a href="../src/gsmemory.h">src/gsmemory.h</a>,
|
|
|
3656 |
<a href="../src/gsstruct.h">src/gsstruct.h</a>,
|
|
|
3657 |
<a href="../src/gsstype.h">src/gsstype.h</a>.
|
|
|
3658 |
</dl>
|
|
|
3659 |
|
|
|
3660 |
<h3><a name="Freeing_storage"></a>Freeing storage</h3>
|
|
|
3661 |
|
|
|
3662 |
<p>
|
|
|
3663 |
Ghostscript's memory management architecture provides three different ways
|
|
|
3664 |
to free objects: explicitly, by reference counting, or by garbage
|
|
|
3665 |
collection. They provide different safety / performance / convenience
|
|
|
3666 |
tradeoffs; we believe that all three are necessary.
|
|
|
3667 |
|
|
|
3668 |
<p>
|
|
|
3669 |
Objects are always freed as a whole; strings may be freed piecemeal.
|
|
|
3670 |
|
|
|
3671 |
<p>
|
|
|
3672 |
An object may have an associated finalization procedure, defined in the
|
|
|
3673 |
structure descriptor. This procedure is called just before the object is
|
|
|
3674 |
freed, independent of which method is being used to free the object. A few
|
|
|
3675 |
types of objects have a virtual finalization procedure as well: the
|
|
|
3676 |
finalization procedure defined in the descriptor simply calls the one in the
|
|
|
3677 |
object.
|
|
|
3678 |
|
|
|
3679 |
<h4><a name="Explicit_freeing"></a>Explicit freeing</h4>
|
|
|
3680 |
|
|
|
3681 |
<p>
|
|
|
3682 |
Objects and strings may be freed explicitly, using the
|
|
|
3683 |
<b><tt>gs_free_</tt></b> virtual procedures in the allocator API. It is up
|
|
|
3684 |
to the client to ensure that all allocated objects are freed at most once,
|
|
|
3685 |
and that there are no dangling pointers.
|
|
|
3686 |
|
|
|
3687 |
<p>
|
|
|
3688 |
Explicit freeing is the fastest method, but is the least convenient and
|
|
|
3689 |
least safe. It is most appropriate when storage is freed in the same
|
|
|
3690 |
procedure where it is allocated, or for storage that is known to be
|
|
|
3691 |
referenced by only one pointer.
|
|
|
3692 |
|
|
|
3693 |
<h4><a name="Reference_counting"></a>Reference counting</h4>
|
|
|
3694 |
|
|
|
3695 |
<p>
|
|
|
3696 |
Objects may be managed by reference counting. When an object is allocated,
|
|
|
3697 |
its reference count may be set to 0 or 1. Subsequently, when the reference
|
|
|
3698 |
count is decremented to 0, the object is freed.
|
|
|
3699 |
|
|
|
3700 |
<p>
|
|
|
3701 |
The reference counting machinery provides its own virtual finalization
|
|
|
3702 |
procedure for all reference-counted objects. The machinery calls this
|
|
|
3703 |
procedure when it is about to free the object (but not when the object is
|
|
|
3704 |
freed in any other way, which is probably a design bug). This is in
|
|
|
3705 |
addition to (and called before) any finalization procedure associated with
|
|
|
3706 |
the object type.
|
|
|
3707 |
|
|
|
3708 |
<p>
|
|
|
3709 |
Reference counting is as fast as explicit freeing, but takes more space in
|
|
|
3710 |
the object. It is most appropriate for relatively large objects which are
|
|
|
3711 |
referenced only from a small set of pointers. Note that reference counting
|
|
|
3712 |
cannot free objects that are involved in a pointer cycle (e.g., A -> B -> C
|
|
|
3713 |
-> A).
|
|
|
3714 |
|
|
|
3715 |
<dl>
|
|
|
3716 |
<dt>
|
|
|
3717 |
Files:
|
|
|
3718 |
<dd>
|
|
|
3719 |
<a href="../src/gsrefct.h">src/gsrefct.h</a>.
|
|
|
3720 |
</dl>
|
|
|
3721 |
|
|
|
3722 |
<h4><a name="Real_garbage_collection"></a>(Real) garbage collection</h4>
|
|
|
3723 |
|
|
|
3724 |
<p>
|
|
|
3725 |
Objects and strings may be freed automatically by a garbage collector. See
|
|
|
3726 |
<a href="#Interpreter_GC">below</a>.
|
|
|
3727 |
|
|
|
3728 |
<h3><a name="Special_implementations"></a>Special implementations</h3>
|
|
|
3729 |
|
|
|
3730 |
<h4><a name="malloc"></a>malloc</h4>
|
|
|
3731 |
|
|
|
3732 |
<p>
|
|
|
3733 |
As mentioned <a href="#Parent_hierarchy">above</a>, the ultimate ancestor of
|
|
|
3734 |
all allocators with an expandable pool is one that calls
|
|
|
3735 |
<b><tt>malloc</tt></b>.
|
|
|
3736 |
|
|
|
3737 |
<dl>
|
|
|
3738 |
<dt>
|
|
|
3739 |
Files:
|
|
|
3740 |
<dd>
|
|
|
3741 |
<a href="../src/gsmalloc.h">src/gsmalloc.h</a>,
|
|
|
3742 |
<a href="../src/gsmalloc.c">src/gsmalloc.c</a>.
|
|
|
3743 |
</dl>
|
|
|
3744 |
|
|
|
3745 |
<h4><a name="Locking"></a>Locking</h4>
|
|
|
3746 |
|
|
|
3747 |
<p>
|
|
|
3748 |
In a multi-threaded environment, if an allocator must be callable from
|
|
|
3749 |
multiple threads (for example, if it is used to allocate structures in one
|
|
|
3750 |
thread that are passed to, and freed by, another thread), the allocator must
|
|
|
3751 |
provide mutex protection. Ghostscript provides this capability in the form
|
|
|
3752 |
of a <em>wrapper</em> allocator, that simply forwards all calls to a
|
|
|
3753 |
<em>target</em> allocator under protection of a mutex. Using the wrapper
|
|
|
3754 |
technique, any allocator can be made thread-safe.
|
|
|
3755 |
|
|
|
3756 |
<dl>
|
|
|
3757 |
<dt>
|
|
|
3758 |
Files:
|
|
|
3759 |
<dd>
|
|
|
3760 |
<a href="../src/gsmemlok.h">src/gsmemlok.h</a>,
|
|
|
3761 |
<a href="../src/gsmemlok.c">src/gsmemlok.c</a>.
|
|
|
3762 |
</dl>
|
|
|
3763 |
|
|
|
3764 |
<h4><a name="Retrying"></a>Retrying</h4>
|
|
|
3765 |
|
|
|
3766 |
<p>
|
|
|
3767 |
In an embedded environment, job failure due to memory exhaustion is very
|
|
|
3768 |
undesirable. Ghostscript provides a wrapper allocator that, when an
|
|
|
3769 |
allocation attempt fails, calls a client-provided procedure that can attempt
|
|
|
3770 |
to free memory, then ask for the original allocation to be retried. For
|
|
|
3771 |
example, such a procedure can wait for a queue to empty, or can free memory
|
|
|
3772 |
occupied by caches.
|
|
|
3773 |
|
|
|
3774 |
<dl>
|
|
|
3775 |
<dt>
|
|
|
3776 |
Files:
|
|
|
3777 |
<dd>
|
|
|
3778 |
<a href="../src/gsmemret.h">src/gsmemret.h</a>,
|
|
|
3779 |
<a href="../src/gsmemret.c">src/gsmemret.c</a>.
|
|
|
3780 |
</dl>
|
|
|
3781 |
|
|
|
3782 |
<h3><a name="Standard_implementation"></a>Standard implementation</h3>
|
|
|
3783 |
|
|
|
3784 |
<p>
|
|
|
3785 |
The standard Ghostscript allocator gets storage from its parent (normally
|
|
|
3786 |
the <b><tt>malloc</tt></b> allocator) in large blocks called
|
|
|
3787 |
<em>chunks</em>, and then allocates objects up from the low end and strings
|
|
|
3788 |
down from the high end. Large objects or strings are allocated in their own
|
|
|
3789 |
chunk.
|
|
|
3790 |
|
|
|
3791 |
<p>
|
|
|
3792 |
The standard allocator maintains a set of free-block lists for small object
|
|
|
3793 |
sizes, one list per size (rounded up to the word size), plus a free-block
|
|
|
3794 |
list for large objects (but not for objects so large that they get their own
|
|
|
3795 |
chunk: when such an object is freed, its chunk is returned to the parent).
|
|
|
3796 |
The lists are not sorted; adjacent blocks are only merged if needed.
|
|
|
3797 |
|
|
|
3798 |
<p>
|
|
|
3799 |
While the standard allocator implements the generic allocator API, and is
|
|
|
3800 |
usable with the library alone, it includes a special hook for the PostScript
|
|
|
3801 |
interpreter to aid in the efficient allocation of PostScript composite
|
|
|
3802 |
objects (arrays and dictionaries). See the section on <a
|
|
|
3803 |
href="#Refs">Refs</a> below for details.
|
|
|
3804 |
|
|
|
3805 |
<dl>
|
|
|
3806 |
<dt>
|
|
|
3807 |
Files:
|
|
|
3808 |
<dd>
|
|
|
3809 |
<a href="../src/gsalloc.c">src/gsalloc.c</a>,
|
|
|
3810 |
<a href="../src/gsalloc.h">src/gsalloc.h</a>,
|
|
|
3811 |
<a href="../src/gxalloc.h">src/gxalloc.h</a>,
|
|
|
3812 |
<a href="../src/gxobj.h">src/gxobj.h</a>.
|
|
|
3813 |
</dl>
|
|
|
3814 |
|
|
|
3815 |
<h3><a name="PostScript_interpreter_extensions"></a>PostScript interpreter extensions</h3>
|
|
|
3816 |
|
|
|
3817 |
<p>
|
|
|
3818 |
The PostScript interpreter uses an allocator that extends the graphic
|
|
|
3819 |
library's standard allocator to handle PostScript objects,
|
|
|
3820 |
<b><tt>save</tt></b> and <b><tt>restore</tt></b>, and real garbage
|
|
|
3821 |
collection.
|
|
|
3822 |
|
|
|
3823 |
<h4><a name="Refs"></a>Refs (PostScript "objects")</h4>
|
|
|
3824 |
|
|
|
3825 |
<p>
|
|
|
3826 |
Ghostscript represents what the PLRM calls PostScript "objects" using a
|
|
|
3827 |
structure called a <b><tt>ref</tt></b>, defined in <a
|
|
|
3828 |
href="../src/iref.h">src/iref.h</a>; packed refs, used for the elements of
|
|
|
3829 |
packed arrays, are defined in <a href="../src/ipacked.h">src/ipacked.h</a>.
|
|
|
3830 |
See those files for detailed information.
|
|
|
3831 |
|
|
|
3832 |
<dl>
|
|
|
3833 |
<dt>
|
|
|
3834 |
Files:
|
|
|
3835 |
<dd>
|
|
|
3836 |
<a href="../src/ipacked.h">src/ipacked.h</a>,
|
|
|
3837 |
<a href="../src/iref.h">src/iref.h</a>.
|
|
|
3838 |
</dl>
|
|
|
3839 |
|
|
|
3840 |
<p>
|
|
|
3841 |
The PLRM calls for two types of "virtual memory" (VM) space: global and
|
|
|
3842 |
local. Ghostscript adds a third space, <em>system</em> VM, whose lifetime
|
|
|
3843 |
is an entire session -- i.e., it is effectively "permanent". All three
|
|
|
3844 |
spaces are subject to garbage collection. There is a separate allocator
|
|
|
3845 |
instance for each VM space (actually, two instances each for global and
|
|
|
3846 |
local spaces; see <a href="#save_forgetsave_restore">below</a>). In a
|
|
|
3847 |
system with multiple contexts and multiple global or local VMs, each global
|
|
|
3848 |
or local VM has its own allocator instance(s).
|
|
|
3849 |
|
|
|
3850 |
<p>
|
|
|
3851 |
Refs that represent PostScript composite objects, and therefore include
|
|
|
3852 |
pointers to stored data, include a 2-bit VM space tag to indicate in which
|
|
|
3853 |
VM the object data are stored. In addition to system, global, and local VM,
|
|
|
3854 |
there is a tag for "foreign" VM, which means that the memory is not managed
|
|
|
3855 |
by a Ghostscript allocator at all. Every store into a composite object must
|
|
|
3856 |
check for <b><tt>invalidaccess</tt></b>: the VM space tag values are chosen
|
|
|
3857 |
to help make this check efficient. See <a
|
|
|
3858 |
href="../src/ivmspace.h">src/ivmspace.h</a>, <a
|
|
|
3859 |
href="../src/iref.h">src/iref.h</a>, and <a
|
|
|
3860 |
href="../src/store.h">src/store.h</a> for details.
|
|
|
3861 |
|
|
|
3862 |
<dl>
|
|
|
3863 |
<dt>
|
|
|
3864 |
Files:
|
|
|
3865 |
<dd>
|
|
|
3866 |
<a href="../src/ivmspace.h">src/ivmspace.h</a>.
|
|
|
3867 |
</dl>
|
|
|
3868 |
|
|
|
3869 |
<p>
|
|
|
3870 |
PostScript composite objects (arrays and dictionaries) are usually small.
|
|
|
3871 |
Using a separate memory manager object for each composite object would waste
|
|
|
3872 |
a lot of space for object headers. Therefore, the interpreter's memory
|
|
|
3873 |
manager packs multiple composite objects (also called "ref-containing
|
|
|
3874 |
objects") into a single memory manager object, similar to the way the memory
|
|
|
3875 |
manager packs multiple objects into a chunk (see <a
|
|
|
3876 |
href="#Standard_implementation">above</a>). See <a
|
|
|
3877 |
href="../src/gxalloc.h">src/gxalloc.h</a> for details. This memory manager
|
|
|
3878 |
object has a structure descriptor, like all other memory manager objects.
|
|
|
3879 |
|
|
|
3880 |
<p>
|
|
|
3881 |
Note that the <b><tt>value.pdict</tt></b>, <b><tt>value.refs</tt></b>, or
|
|
|
3882 |
<b><tt>value.packed</tt></b> member of a ref must point to a PostScript
|
|
|
3883 |
composite object, and therefore can point into the middle of a memory
|
|
|
3884 |
manager object. This requires special handling by the garbage collector (<a
|
|
|
3885 |
href="#Interpreter_GC">q.v.</a>).
|
|
|
3886 |
|
|
|
3887 |
<dl>
|
|
|
3888 |
<dt>
|
|
|
3889 |
Files:
|
|
|
3890 |
<dd>
|
|
|
3891 |
<a href="../src/ialloc.c">src/ialloc.c</a>,
|
|
|
3892 |
<a href="../src/ialloc.h">src/ialloc.h</a>,
|
|
|
3893 |
<a href="../src/iastate.h">src/iastate.h</a>,
|
|
|
3894 |
<a href="../src/iastruct.h">src/iastruct.h</a>,
|
|
|
3895 |
<a href="../src/ilocate.c">src/ilocate.c</a>,
|
|
|
3896 |
<a href="../src/imemory.h">src/imemory.h</a>,
|
|
|
3897 |
<a href="../src/istruct.h">src/istruct.h</a>.
|
|
|
3898 |
</dl>
|
|
|
3899 |
|
|
|
3900 |
<h4><a name="save_forgetsave_restore"></a>save/.forgetsave/restore</h4>
|
|
|
3901 |
|
|
|
3902 |
<p>
|
|
|
3903 |
In addition to <b><tt>save</tt></b> and <b><tt>restore</tt></b>, Ghostscript
|
|
|
3904 |
provides a <b><tt>.forgetsave</tt></b> operator that makes things as though
|
|
|
3905 |
a given <b><tt>save</tt></b> had never happened. (In data base terminology,
|
|
|
3906 |
<b><tt>save</tt></b> is "begin transaction", <b><tt>restore</tt></b> is
|
|
|
3907 |
"abort transaction", and <b><tt>.forgetsave</tt></b> is "end/commit
|
|
|
3908 |
transaction"). <b><tt>.forgetsave</tt></b> was implemented for a specific
|
|
|
3909 |
commercial customer (who may no longer even be using it): it was a pain to
|
|
|
3910 |
make work, but it's in the code now, and should be maintained. See the
|
|
|
3911 |
extensive comments in <a href="../src/isave.c">src/isave.c</a> for more
|
|
|
3912 |
information about how these operations work.
|
|
|
3913 |
|
|
|
3914 |
<dl>
|
|
|
3915 |
<dt>
|
|
|
3916 |
Files:
|
|
|
3917 |
<dd>
|
|
|
3918 |
<a href="../src/idosave.h">src/idosave.h</a>,
|
|
|
3919 |
<a href="../src/isave.c">src/isave.c</a>,
|
|
|
3920 |
<a href="../src/isave.h">src/isave.h</a>,
|
|
|
3921 |
<a href="../src/isstate.h">src/isstate.h</a>,
|
|
|
3922 |
<a href="../src/store.h">src/store.h</a>.
|
|
|
3923 |
</dl>
|
|
|
3924 |
|
|
|
3925 |
<h4><a name="Stable_allocators"></a>Stable allocators</h4>
|
|
|
3926 |
|
|
|
3927 |
<p>
|
|
|
3928 |
Even though <b><tt>save</tt></b> and <b><tt>restore</tt></b> are concepts
|
|
|
3929 |
from the PostScript interpreter, the generic allocator architecture and API
|
|
|
3930 |
include a feature to support them, called <em>stable</em> allocators. Every
|
|
|
3931 |
allocator has an associated stable allocator, which tags pointers with the
|
|
|
3932 |
same VM space number but which is not subject to <b><tt>save</tt></b> and
|
|
|
3933 |
<b><tt>restore</tt></b>. System VM is intrinsically stable (its associated
|
|
|
3934 |
stable allocator is the same allocator), so there are only 5 allocators in
|
|
|
3935 |
ordinary single-context usage: system VM, stable global VM, ordinary global
|
|
|
3936 |
VM, stable local VM, ordinary local VM.
|
|
|
3937 |
|
|
|
3938 |
<p>
|
|
|
3939 |
The reason that we cannot simply allocate all stable objects in system VM is
|
|
|
3940 |
that their refs must still be tagged with the correct VM space number, so
|
|
|
3941 |
that the check against storing pointers from global VM to local VM can be
|
|
|
3942 |
enforced properly.
|
|
|
3943 |
|
|
|
3944 |
<p>
|
|
|
3945 |
All PostScript objects are normally allocated with the non-stable
|
|
|
3946 |
allocators. The stable allocators should be used with care, since using
|
|
|
3947 |
them can easily create dangling pointers: if storage allocated with a stable
|
|
|
3948 |
allocator contains any references to PostScript objects, the client is
|
|
|
3949 |
responsible for ensuring that the references don't outlive the referenced
|
|
|
3950 |
objects, normally by ensuring that any such referenced objects are allocated
|
|
|
3951 |
at the outermost <b><tt>save</tt></b> level.
|
|
|
3952 |
|
|
|
3953 |
<p>
|
|
|
3954 |
The original reason for wanting stable allocators was the PostScript stacks,
|
|
|
3955 |
which are essentially PostScript arrays but are not subject to
|
|
|
3956 |
<b><tt>save</tt></b> and <b><tt>restore</tt></b>. Some other uses of stable
|
|
|
3957 |
allocators are:
|
|
|
3958 |
|
|
|
3959 |
<ul>
|
|
|
3960 |
|
|
|
3961 |
<li>Several per-context structures for DPS.
|
|
|
3962 |
|
|
|
3963 |
<li>Paths (see <b><tt>gstate_path_memory</tt></b> in
|
|
|
3964 |
<a href="../src/gsstate.c">src/gsstate.c</a>.
|
|
|
3965 |
|
|
|
3966 |
<li>Row buffers for images (see <b><tt>gs_image_row_memory</tt></b> in <a
|
|
|
3967 |
href="../src/gsimage.c">src/gsimage.c</a>), because the data-reading
|
|
|
3968 |
procedure for an image can invoke <b><tt>save</tt></b> and
|
|
|
3969 |
<b><tt>restore</tt></b>.
|
|
|
3970 |
|
|
|
3971 |
<li>Notification lists for fonts, to handle the sequence allocate .. save
|
|
|
3972 |
.. register .. restore.
|
|
|
3973 |
|
|
|
3974 |
<li>The parameter lists for pdfwrite and pswrite devices (in <a
|
|
|
3975 |
href="../src/gdevpsdp.c">src/gdevpsdp.c</a>), because the whole issue of
|
|
|
3976 |
local vs. global VM for setpagedevice is, in the words of Ed Taft of Adobe,
|
|
|
3977 |
"a mess".
|
|
|
3978 |
|
|
|
3979 |
<li>Many places in the pdfwrite driver, because many of its bookkeeping
|
|
|
3980 |
structures must not be restorable.
|
|
|
3981 |
|
|
|
3982 |
</ul>
|
|
|
3983 |
|
|
|
3984 |
<p>
|
|
|
3985 |
For more specific examples, search the sources for references to
|
|
|
3986 |
<b><tt>gs_memory_stable</tt></b>.
|
|
|
3987 |
|
|
|
3988 |
<h4><a name="Interpreter_GC"></a>Garbage collection</h4>
|
|
|
3989 |
|
|
|
3990 |
<p>
|
|
|
3991 |
The interpreter's garbage collector is a compacting, non-conservative,
|
|
|
3992 |
mark-and-sweep collector.
|
|
|
3993 |
|
|
|
3994 |
<ul>
|
|
|
3995 |
<li>It compacts storage because that is the only way to avoid permanent
|
|
|
3996 |
sandbars, which is essential in limited-memory environments.
|
|
|
3997 |
<li>It is non-conservative because conservative collectors (which attempt
|
|
|
3998 |
to determine whether arbitrary bit patterns are pointers) cannot compact.
|
|
|
3999 |
<li>It uses mark-and-sweep, rather than a more modern copying approach,
|
|
|
4000 |
because it cannot afford the extra memory required for copying.
|
|
|
4001 |
</ul>
|
|
|
4002 |
|
|
|
4003 |
<p>
|
|
|
4004 |
Because the garbage collector is non-conservative, it cannot be run if there
|
|
|
4005 |
are any pointers to movable storage from the C stack. Thus it cannot be run
|
|
|
4006 |
automatically when the allocator is unable to allocate requested space.
|
|
|
4007 |
Instead, when the allocator has allocated a given amount of storage (the
|
|
|
4008 |
<b><tt>vm_threshold</tt></b> amount, corresponding to the PostScript
|
|
|
4009 |
<b><tt>VMThreshold</tt></b> parameter), it sets a flag that the interpreter
|
|
|
4010 |
checks in the main loop. When the interpreter sees that this flag is set,
|
|
|
4011 |
it calls the garbage collector: at that point, there are no problematic
|
|
|
4012 |
pointers from the stack.
|
|
|
4013 |
|
|
|
4014 |
<p>
|
|
|
4015 |
Roots for tracing must be registered with the allocator. Most roots are
|
|
|
4016 |
registered during initialization.
|
|
|
4017 |
|
|
|
4018 |
<p>
|
|
|
4019 |
"Mark-and-sweep" is a bit of a misnomer. The garbage collector actually has
|
|
|
4020 |
5 main phases:
|
|
|
4021 |
|
|
|
4022 |
<ul>
|
|
|
4023 |
<li>Sweep to clear marks;
|
|
|
4024 |
<li>Trace and mark;
|
|
|
4025 |
<li>Sweep to compute relocation;
|
|
|
4026 |
<li>Sweep to relocate pointers;
|
|
|
4027 |
<li>Sweep and compact.
|
|
|
4028 |
</ul>
|
|
|
4029 |
|
|
|
4030 |
<p>
|
|
|
4031 |
There is some extra complexity to handle collecting local VM only. In this
|
|
|
4032 |
case, all pointers in global VM are treated as roots, and global VM is not
|
|
|
4033 |
compacted.
|
|
|
4034 |
|
|
|
4035 |
<p>
|
|
|
4036 |
As noted above, PostScript arrays and strings can have refs that point
|
|
|
4037 |
within them (because of <b><tt>getinterval</tt></b>). Thus the garbage
|
|
|
4038 |
collector must mark each element of an array, and even each byte of a
|
|
|
4039 |
string, individually. Specifically, it marks objects, refs, and strings
|
|
|
4040 |
using 3 different mechanisms:
|
|
|
4041 |
|
|
|
4042 |
<ul>
|
|
|
4043 |
|
|
|
4044 |
<li>Objects have a mark bit in their header: see
|
|
|
4045 |
<a href="../src/gxobj.h">src/gxobj.h</a>,
|
|
|
4046 |
|
|
|
4047 |
<li>Refs and packed refs have a reserved mark bit: see <a
|
|
|
4048 |
href="../src/iref.h">src/iref.h</a> and <a
|
|
|
4049 |
href="../src/ipacked.h">src/ipacked.h</a>.
|
|
|
4050 |
|
|
|
4051 |
<li>Strings use a separate bit table, with one bit per string byte: see
|
|
|
4052 |
<a href="../src/gxalloc.h">src/gxalloc.h</a>,
|
|
|
4053 |
|
|
|
4054 |
</ul>
|
|
|
4055 |
|
|
|
4056 |
<p>
|
|
|
4057 |
Similarly, it records the relocation information for objects, refs, and
|
|
|
4058 |
strings differently:
|
|
|
4059 |
|
|
|
4060 |
<ul>
|
|
|
4061 |
|
|
|
4062 |
<li>Objects record relocation in the object header.
|
|
|
4063 |
|
|
|
4064 |
<li>Refs record relocation in unused fields of refs such as nulls that
|
|
|
4065 |
don't use their <b><tt>value</tt></b> field. Every memory manager object
|
|
|
4066 |
that stores ref-containing objects as described above has an extra, unused
|
|
|
4067 |
ref at the end for this purpose.
|
|
|
4068 |
|
|
|
4069 |
<li>Strings use a separate relocation table.
|
|
|
4070 |
|
|
|
4071 |
</ul>
|
|
|
4072 |
|
|
|
4073 |
<dl>
|
|
|
4074 |
<dt>
|
|
|
4075 |
Files:
|
|
|
4076 |
<dd>
|
|
|
4077 |
<a href="../src/igc.c">src/igc.c</a>,
|
|
|
4078 |
<a href="../src/igc.h">src/igc.h</a>,
|
|
|
4079 |
<a href="../src/igcref.c">src/igcref.c</a>,
|
|
|
4080 |
<a href="../src/igcstr.c">src/igcstr.c</a>,
|
|
|
4081 |
<a href="../src/igcstr.h">src/igcstr.h</a>,
|
|
|
4082 |
<a href="../src/ireclaim.c">src/ireclaim.c</a>.
|
|
|
4083 |
</dl>
|
|
|
4084 |
|
|
|
4085 |
<hr>
|
|
|
4086 |
|
|
|
4087 |
<h2><a name="Portability"></a>Portability</h2>
|
|
|
4088 |
|
|
|
4089 |
<p>
|
|
|
4090 |
One of Ghostscript's most important features is its great portability across
|
|
|
4091 |
platforms (CPUs, operating systems, compilers, and build tools). The code
|
|
|
4092 |
supports portability through two mechanisms:
|
|
|
4093 |
|
|
|
4094 |
<ul>
|
|
|
4095 |
|
|
|
4096 |
<li><a href="#Structural">Structural mechanisms</a> -- segregating
|
|
|
4097 |
platform-dependent information into files in a particular way.
|
|
|
4098 |
|
|
|
4099 |
<li><a href="#Coding">Coding standards</a> -- avoiding relying on byte
|
|
|
4100 |
order, scalar size, and platform-specific compiler or library features.
|
|
|
4101 |
|
|
|
4102 |
</ul>
|
|
|
4103 |
|
|
|
4104 |
<h3><a name="Structural"></a>Structural</h3>
|
|
|
4105 |
|
|
|
4106 |
<h4><a name="CPU_and_compiler"></a>CPU and compiler</h4>
|
|
|
4107 |
|
|
|
4108 |
<p>
|
|
|
4109 |
Ghostscript attempts to discover characteristics of the CPU and compiler
|
|
|
4110 |
automatically during the build process, by compiling and then executing a
|
|
|
4111 |
program called <b><tt>genarch</tt></b>. <b><tt>genarch</tt></b> generates a
|
|
|
4112 |
file <b><tt>obj/arch.h</tt></b>, which almost all Ghostscript files then
|
|
|
4113 |
include. This works well for things like word size, byte order, and
|
|
|
4114 |
floating point representation, but it can't determine whether or not a
|
|
|
4115 |
compiler supports a particular feature, because if a feature is absent, the
|
|
|
4116 |
compilation may fail.
|
|
|
4117 |
|
|
|
4118 |
<dl>
|
|
|
4119 |
<dt>
|
|
|
4120 |
Files:
|
|
|
4121 |
<dd>
|
|
|
4122 |
<a href="../src/genarch.c">src/genarch.c</a>,
|
|
|
4123 |
<a href="../obj/arch.h">obj/arch.h</a>.
|
|
|
4124 |
</dl>
|
|
|
4125 |
|
|
|
4126 |
<h4><a name="Library_headers"></a>Library headers</h4>
|
|
|
4127 |
|
|
|
4128 |
<p>
|
|
|
4129 |
Despite the supposed standardization of ANSI C, platforms vary considerably
|
|
|
4130 |
in where (and whether) they provide various standard library facilities.
|
|
|
4131 |
Currently, Ghostscript's build process doesn't attempt to sort this out
|
|
|
4132 |
automatically. Instead, for each library header file
|
|
|
4133 |
<b><tt><</tt></b><em>xxx</em><b><tt>.h></tt></b> there is a
|
|
|
4134 |
corresponding Ghostscript source file
|
|
|
4135 |
<b><tt>src/</tt></b><em>xxx</em><b><tt>_.h</tt></b>, containing a set of
|
|
|
4136 |
compile-time conditionals that attempt to select the correct platform header
|
|
|
4137 |
file, or in some cases substitute Ghostscript's own code for a missing
|
|
|
4138 |
facility. You may need to edit these files when moving to platforms with
|
|
|
4139 |
unusually non-standard libraries.
|
|
|
4140 |
|
|
|
4141 |
<dl>
|
|
|
4142 |
<dt>
|
|
|
4143 |
Files:
|
|
|
4144 |
<dd>
|
|
|
4145 |
<a href="../src/ctype_.h">src/ctype_.h</a>,
|
|
|
4146 |
<a href="../src/dirent_.h">src/dirent_.h</a>,
|
|
|
4147 |
<a href="../src/dos_.h">src/dos_.h</a>,
|
|
|
4148 |
<a href="../src/errno_.h">src/errno_.h</a>,
|
|
|
4149 |
<a href="../src/fcntl_.h">src/fcntl_.h</a>,
|
|
|
4150 |
<a href="../src/jerror_.h">src/jerror_.h</a>,
|
|
|
4151 |
<a href="../src/malloc_.h">src/malloc_.h</a>,
|
|
|
4152 |
<a href="../src/math_.h">src/math_.h</a>,
|
|
|
4153 |
<a href="../src/memory_.h">src/memory_.h</a>,
|
|
|
4154 |
<a href="../src/pipe_.h">src/pipe_.h</a>,
|
|
|
4155 |
<a href="../src/png_.h">src/png_.h</a>,
|
|
|
4156 |
<a href="../src/stat_.h">src/stat_.h</a>,
|
|
|
4157 |
<a href="../src/stdint_.h">src/stdint_.h</a>,
|
|
|
4158 |
<a href="../src/stdio_.h">src/stdio_.h</a>,
|
|
|
4159 |
<a href="../src/string_.h">src/string_.h</a>,
|
|
|
4160 |
<a href="../src/time_.h">src/time_.h</a>,
|
|
|
4161 |
<a href="../src/unistd_.h">src/unistd_.h</a>,
|
|
|
4162 |
<a href="../src/vmsmath.h">src/vmsmath.h</a>,
|
|
|
4163 |
<a href="../src/windows_.h">src/windows_.h</a>,
|
|
|
4164 |
<a href="../src/x_.h">src/x_.h</a>.
|
|
|
4165 |
</dl>
|
|
|
4166 |
|
|
|
4167 |
<p>
|
|
|
4168 |
It has been suggested that the GNU <b><tt>configure</tt></b> scripts do the
|
|
|
4169 |
above better, for Unix systems, than Ghostscript's current methods. While
|
|
|
4170 |
this may be true, we have found <b><tt>configure</tt></b> scripts difficult
|
|
|
4171 |
to write, understand, and maintain; and the <b><tt>autoconf</tt></b> tool
|
|
|
4172 |
for generating <b><tt>configure</tt></b> scripts, which we found easy to
|
|
|
4173 |
use, doesn't cover much of the ground that Ghostscript requires.
|
|
|
4174 |
|
|
|
4175 |
<h4><a name="Cross_platform_APIs"></a>Cross-platform APIs</h4>
|
|
|
4176 |
|
|
|
4177 |
<p>
|
|
|
4178 |
For a few library facilities that are available on all platforms but are not
|
|
|
4179 |
well standardized, or that may need to be changed for special environments,
|
|
|
4180 |
Ghostscript defines its own APIs. It is an architectural property of
|
|
|
4181 |
Ghostscript that the implementations of these APIs are the only .c files for
|
|
|
4182 |
which the choice of platform (as opposed to choices of drivers or optional
|
|
|
4183 |
features) determines whether they are compiled and linked into an
|
|
|
4184 |
executable.
|
|
|
4185 |
|
|
|
4186 |
<dl>
|
|
|
4187 |
|
|
|
4188 |
<dt>
|
|
|
4189 |
API:
|
|
|
4190 |
<dd>
|
|
|
4191 |
<a href="../src/gp.h">src/gp.h</a>,
|
|
|
4192 |
<a href="../src/gpcheck.h">src/gpcheck.h</a>,
|
|
|
4193 |
<a href="../src/gpgetenv.h">src/gpgetenv.h</a>,
|
|
|
4194 |
<a href="../src/gpmisc.h">src/gpmisc.h</a>,
|
|
|
4195 |
<a href="../src/gpsync.h">src/gpsync.h</a>.
|
|
|
4196 |
|
|
|
4197 |
<dt>
|
|
|
4198 |
Implementation files shared among multiple platforms:
|
|
|
4199 |
<dd>
|
|
|
4200 |
<a href="../src/gp_getnv.c">src/gp_getnv.c</a>,
|
|
|
4201 |
<a href="../src/gp_mktmp.c">src/gp_mktmp.c</a>,
|
|
|
4202 |
<a href="../src/gp_nsync.c">src/gp_nsync.c</a>,
|
|
|
4203 |
<a href="../src/gp_psync.c">src/gp_psync.c</a>,
|
|
|
4204 |
<a href="../src/gp_strdl.c">src/gp_strdl.c</a>,
|
|
|
4205 |
<a href="../src/gpmisc.c">src/gpmisc.c</a>.
|
|
|
4206 |
|
|
|
4207 |
<dt>
|
|
|
4208 |
Platform-specific implementation files:
|
|
|
4209 |
<dd>
|
|
|
4210 |
<a href="../src/gp_dosfe.c">src/gp_dosfe.c</a>,
|
|
|
4211 |
<a href="../src/gp_dosfs.c">src/gp_dosfs.c</a>,
|
|
|
4212 |
<a href="../src/gp_dvx.c">src/gp_dvx.c</a>,
|
|
|
4213 |
<a href="../src/gp_iwatc.c">src/gp_iwatc.c</a>,
|
|
|
4214 |
<a href="../src/gp_msdos.c">src/gp_msdos.c</a>,
|
|
|
4215 |
<a href="../src/gp_mshdl.c">src/gp_mshdl.c</a>,
|
|
|
4216 |
<a href="../src/gp_msio.c">src/gp_msio.c</a>,
|
|
|
4217 |
<a href="../src/gp_mslib.c">src/gp_mslib.c</a>,
|
|
|
4218 |
<a href="../src/gp_mswin.c">src/gp_mswin.c</a>,
|
|
|
4219 |
<a href="../src/gp_mswin.h">src/gp_mswin.h</a>,
|
|
|
4220 |
<a href="../src/gp_ntfs.c">src/gp_ntfs.c</a>,
|
|
|
4221 |
<a href="../src/gp_os2.c">src/gp_os2.c</a>,
|
|
|
4222 |
<a href="../src/gp_os2.h">src/gp_os2.h</a>,
|
|
|
4223 |
<a href="../src/gp_os9.c">src/gp_os9.c</a>,
|
|
|
4224 |
<a href="../src/gp_stdia.c">src/gp_stdia.c</a>,
|
|
|
4225 |
<a href="../src/gp_stdin.c">src/gp_stdin.c</a>,
|
|
|
4226 |
<a href="../src/gp_sysv.c">src/gp_sysv.c</a>,
|
|
|
4227 |
<a href="../src/gp_unifn.c">src/gp_unifn.c</a>,
|
|
|
4228 |
<a href="../src/gp_unifs.c">src/gp_unifs.c</a>,
|
|
|
4229 |
<a href="../src/gp_unix.c">src/gp_unix.c</a>,
|
|
|
4230 |
<a href="../src/gp_unix_cache.c">src/gp_unix_cache.c</a>,
|
|
|
4231 |
<a href="../src/gp_vms.c">src/gp_vms.c</a>,
|
|
|
4232 |
<a href="../src/gp_wgetv.c">src/gp_wgetv.c</a>,
|
|
|
4233 |
<a href="../src/gp_win32.c">src/gp_win32.c</a>,
|
|
|
4234 |
<a href="../src/gp_wsync.c">src/gp_wsync.c</a>,
|
|
|
4235 |
<a href="../src/gs_dll_call.h">src/gs_dll_call.h</a>.
|
|
|
4236 |
|
|
|
4237 |
</dl>
|
|
|
4238 |
|
|
|
4239 |
<h4><a name="Makefiles"></a>Makefiles</h4>
|
|
|
4240 |
|
|
|
4241 |
<p>
|
|
|
4242 |
For information on the structure and conventions used within makefiles, see
|
|
|
4243 |
the <a href="#Makefile_structure">Makefile structure</a> section above.
|
|
|
4244 |
|
|
|
4245 |
<p>
|
|
|
4246 |
Ghostscript's makefiles are structured very similarly to the cross-platform
|
|
|
4247 |
library files. The great majority of the makefiles are portable across all
|
|
|
4248 |
platforms and all versions of <b><tt>make</tt></b>. To achieve this, the
|
|
|
4249 |
platform-independent makefiles must obey two constraints beyond those of the
|
|
|
4250 |
POSIX <b><tt>make</tt></b> program:
|
|
|
4251 |
|
|
|
4252 |
<ul>
|
|
|
4253 |
|
|
|
4254 |
<li>No conditionals or <b><tt>include</tt></b>s are allowed. While most
|
|
|
4255 |
<b><tt>make</tt></b> programs now provide some form of conditional execution
|
|
|
4256 |
and some form of inclusion, there is no agreement on the syntax.
|
|
|
4257 |
(Conditionals and includes are allowed in platform-dependent makefiles; in
|
|
|
4258 |
fact, an inclusion facility is required.)
|
|
|
4259 |
|
|
|
4260 |
<li>There must be a space on both sides of the : that separates the target
|
|
|
4261 |
of a rule from its dependencies. This is required for compatibility with
|
|
|
4262 |
the OpenVMS <b><tt>MMS</tt></b> and <b><tt>MMK</tt></b> programs.
|
|
|
4263 |
|
|
|
4264 |
</ul>
|
|
|
4265 |
|
|
|
4266 |
<p>
|
|
|
4267 |
The top-level makefile for each platform (where "platform" includes the OS,
|
|
|
4268 |
the compiler, and the flavor of <b><tt>make</tt></b>) contains all the build
|
|
|
4269 |
options, plus <b><tt>include</tt></b>s for the generic makefiles and any
|
|
|
4270 |
platform-dependent makefiles that are shared among multiple platforms.
|
|
|
4271 |
|
|
|
4272 |
<p>
|
|
|
4273 |
While most of the top-level makefiles build a PostScript and/or PDF
|
|
|
4274 |
interpreter configuration, there are also a few makefiles that build a test
|
|
|
4275 |
program that only uses the graphics library without any language
|
|
|
4276 |
interpreter. Among other things, this can be helpful in verifying that no
|
|
|
4277 |
accidental dependencies on the interpreter have crept into the library or
|
|
|
4278 |
drivers.
|
|
|
4279 |
|
|
|
4280 |
<p>
|
|
|
4281 |
For families of similar platforms, the question arises whether to use
|
|
|
4282 |
multiple top-level makefiles, or whether to use a single top-level makefile
|
|
|
4283 |
that may require minor editing for some (or all) platforms. Ghostscript
|
|
|
4284 |
currently uses the following top-level makefiles for building interpreter
|
|
|
4285 |
configurations:
|
|
|
4286 |
|
|
|
4287 |
<ul>
|
|
|
4288 |
|
|
|
4289 |
<li>POSIX systems (inluding Linux and Unix):
|
|
|
4290 |
<ul>
|
|
|
4291 |
<li><a href="../src/configure.ac">src/configure.ac</a>,
|
|
|
4292 |
GNU Autoconf source script for automatic build configuration.
|
|
|
4293 |
<li><a href="../src/Makefile.in">src/Makefile.in</a>,
|
|
|
4294 |
source for the top-level makefile used in the Autoconf build.
|
|
|
4295 |
<li><a href="../src/unix-gcc.mak">src/unix-gcc.mak</a>,
|
|
|
4296 |
for Unix with gcc.
|
|
|
4297 |
<li><a href="../src/unixansi.mak">src/unixansi.mak</a>,
|
|
|
4298 |
for Unix with an ANSI C compiler other than gcc.
|
|
|
4299 |
</ul>
|
|
|
4300 |
|
|
|
4301 |
<li>PC:
|
|
|
4302 |
<ul>
|
|
|
4303 |
<li><a href="../src/bcwin32.mak">src/bcwin32.mak</a>,
|
|
|
4304 |
for MS Windows with Borland C++ Builder.
|
|
|
4305 |
<li><a href="../src/msvc32.mak">src/msvc32.mak</a>,
|
|
|
4306 |
for MS Windows with Microsoft Visual C (MSVC).
|
|
|
4307 |
<li><a href="../src/os2.mak">src/os2.mak</a>,
|
|
|
4308 |
for MS-DOS or OS/2 GCC/EMX environment.
|
|
|
4309 |
<li><a href="../src/watcw32.mak">src/watcw32.mak</a>,
|
|
|
4310 |
for MS Windows with Watcom C.
|
|
|
4311 |
</ul>
|
|
|
4312 |
|
|
|
4313 |
<li>Macintosh:
|
|
|
4314 |
<ul>
|
|
|
4315 |
<li><a href="../src/macosx.mak">src/macosx.mak</a>,
|
|
|
4316 |
commandline makefile for MacOS X.
|
|
|
4317 |
<li><a href="../src/macos-mcp.mak">src/macos-mcp.mak</a>,
|
|
|
4318 |
dummy makefile to generate an xml project file for Metrowerks Codewarrior.
|
|
|
4319 |
</ul>
|
|
|
4320 |
|
|
|
4321 |
|
|
|
4322 |
<li>Other:
|
|
|
4323 |
<ul>
|
|
|
4324 |
<li><a href="../src/all-arch.mak">src/all-arch.mak</a>,
|
|
|
4325 |
for building on many Unix systems in a networked test environment.
|
|
|
4326 |
<li><a href="../src/dvx-gcc.mak">src/dvx-gcc.mak</a>,
|
|
|
4327 |
for DesqView/X with gcc.
|
|
|
4328 |
<li><a href="../src/openvms.mak">src/openvms.mak</a>,
|
|
|
4329 |
for OpenVMS with Digital's CC compiler and the MMS build program.
|
|
|
4330 |
<li><a href="../src/openvms.mmk">src/openvms.mmk</a>,
|
|
|
4331 |
for OpenVMS with Digital's CC compiler and the MMK build program.
|
|
|
4332 |
</ul>
|
|
|
4333 |
|
|
|
4334 |
</ul>
|
|
|
4335 |
|
|
|
4336 |
<p>
|
|
|
4337 |
The following top-level makefiles build the library test program:
|
|
|
4338 |
|
|
|
4339 |
<ul>
|
|
|
4340 |
<li><a href="../src/ugcclib.mak">src/ugcclib.mak</a>,
|
|
|
4341 |
on Unix with gcc.
|
|
|
4342 |
<li><a href="../src/msvclib.mak">src/msvclib.mak</a>,
|
|
|
4343 |
on MS Windows with MSVC.
|
|
|
4344 |
<li><a href="../src/watclib.mak">src/watclib.mak</a>,
|
|
|
4345 |
on extended MS-DOS with Watcom C.
|
|
|
4346 |
</ul>
|
|
|
4347 |
|
|
|
4348 |
<p>
|
|
|
4349 |
The MSVC makefiles may require editing to select between different versions
|
|
|
4350 |
of MSVC, since different versions may have slightly incompatible command
|
|
|
4351 |
line switches or customary installation path names. The Unix makefiles
|
|
|
4352 |
often require editing to deal with differing library path names and/or
|
|
|
4353 |
library names. For details, see <a href="Make.htm#Unix_build">the Unix
|
|
|
4354 |
section</a> of the documentation for building Ghostscript.
|
|
|
4355 |
|
|
|
4356 |
<dl>
|
|
|
4357 |
|
|
|
4358 |
<dt>
|
|
|
4359 |
Library test program:
|
|
|
4360 |
<dd>
|
|
|
4361 |
<a href="../src/gslib.c">src/gslib.c</a>.
|
|
|
4362 |
|
|
|
4363 |
<dt>
|
|
|
4364 |
Platform-independent makefiles:
|
|
|
4365 |
<dd>
|
|
|
4366 |
|
|
|
4367 |
<dl>
|
|
|
4368 |
|
|
|
4369 |
<dt>
|
|
|
4370 |
Graphics library and support:
|
|
|
4371 |
<dd>
|
|
|
4372 |
<a href="../src/contrib.mak">src/contrib.mak</a>,
|
|
|
4373 |
<a href="../src/devs.mak">src/devs.mak</a>,
|
|
|
4374 |
<a href="../src/gs.mak">src/gs.mak</a>,
|
|
|
4375 |
<a href="../src/lib.mak">src/lib.mak</a>,
|
|
|
4376 |
<a href="../src/version.mak">src/version.mak</a>.
|
|
|
4377 |
|
|
|
4378 |
<dt>
|
|
|
4379 |
PostScript interpreter and fonts:
|
|
|
4380 |
<dd>
|
|
|
4381 |
<a href="../src/cfonts.mak">src/cfonts.mak</a>,
|
|
|
4382 |
<a href="../src/int.mak">src/int.mak</a>,
|
|
|
4383 |
<a href="../src/wmin.mak">src/wmin.mak</a>.
|
|
|
4384 |
|
|
|
4385 |
<dt>
|
|
|
4386 |
Third-party libraries:
|
|
|
4387 |
<dd>
|
|
|
4388 |
<a href="../src/icclib.mak">src/icclib.mak</a>,
|
|
|
4389 |
<a href="../src/ijs.mak">src/ijs.mak</a>,
|
|
|
4390 |
<a href="../src/jasper.mak">src/jasper.mak</a>,
|
|
|
4391 |
<a href="../src/jbig2.mak">src/jbig2.mak</a>,
|
|
|
4392 |
<a href="../src/jpeg.mak">src/jpeg.mak</a>,
|
|
|
4393 |
<a href="../src/libpng.mak">src/libpng.mak</a>,
|
|
|
4394 |
<a href="../src/zlib.mak">src/zlib.mak</a>.
|
|
|
4395 |
|
|
|
4396 |
</dl>
|
|
|
4397 |
|
|
|
4398 |
<dt>
|
|
|
4399 |
Shared platform-dependent makefiles:
|
|
|
4400 |
<dd>
|
|
|
4401 |
|
|
|
4402 |
<dl>
|
|
|
4403 |
|
|
|
4404 |
<dt>
|
|
|
4405 |
Unix:
|
|
|
4406 |
<dd>
|
|
|
4407 |
<a href="../src/unix-aux.mak">src/unix-aux.mak</a>,
|
|
|
4408 |
<a href="../src/unix-dll.mak">src/unix-dll.mak</a>,
|
|
|
4409 |
<a href="../src/unix-end.mak">src/unix-end.mak</a>,
|
|
|
4410 |
<a href="../src/unixhead.mak">src/unixhead.mak</a>,
|
|
|
4411 |
<a href="../src/unixinst.mak">src/unixinst.mak</a>,
|
|
|
4412 |
<a href="../src/unixlink.mak">src/unixlink.mak</a>.
|
|
|
4413 |
|
|
|
4414 |
<dt>
|
|
|
4415 |
Microsoft Windows and MS-DOS:
|
|
|
4416 |
<dd>
|
|
|
4417 |
<a href="../src/msvccmd.mak">src/msvccmd.mak</a>,
|
|
|
4418 |
<a href="../src/msvctail.mak">src/msvctail.mak</a>,
|
|
|
4419 |
<a href="../src/pcwin.mak">src/pcwin.mak</a>,
|
|
|
4420 |
<a href="../src/wccommon.mak">src/wccommon.mak</a>,
|
|
|
4421 |
<a href="../src/wctail.mak">src/wctail.mak</a>,
|
|
|
4422 |
<a href="../src/winint.mak">src/winint.mak</a>,
|
|
|
4423 |
<a href="../src/winlib.mak">src/winlib.mak</a>,
|
|
|
4424 |
<a href="../src/winplat.mak">src/winplat.mak</a>.
|
|
|
4425 |
|
|
|
4426 |
<dt>
|
|
|
4427 |
Other:
|
|
|
4428 |
<dd>
|
|
|
4429 |
<a href="../src/dvx-head.mak">src/dvx-head.mak</a>,
|
|
|
4430 |
<a href="../src/dvx-tail.mak">src/dvx-tail.mak</a>.<br>
|
|
|
4431 |
<a href="../src/macos-fw.mak">src/macos-fw.mak</a>,
|
|
|
4432 |
for building as a MacOS X Framework.
|
|
|
4433 |
|
|
|
4434 |
</dl>
|
|
|
4435 |
|
|
|
4436 |
</dl>
|
|
|
4437 |
|
|
|
4438 |
<h3><a name="Coding"></a>Coding</h3>
|
|
|
4439 |
|
|
|
4440 |
<p>
|
|
|
4441 |
Coding for portability requires avoiding both <em>explicit</em>
|
|
|
4442 |
dependencies, such as platform-dependent <b><tt>#ifdef</tt></b>s, and
|
|
|
4443 |
<em>implicit</em> dependencies, such as dependencies on byte order or the
|
|
|
4444 |
size of the integral types.
|
|
|
4445 |
|
|
|
4446 |
<h4><a name="Explicit_dependencies"></a>Explicit dependencies</h4>
|
|
|
4447 |
|
|
|
4448 |
<p>
|
|
|
4449 |
The platform-independent .c files never, ever, use <b><tt>#ifdef</tt></b> or
|
|
|
4450 |
<b><tt>#if</tt></b> to select code for specific platforms. Instead, we
|
|
|
4451 |
always try to characterize some abstract property that is being tested. For
|
|
|
4452 |
example, rather than checking for macros that are defined on those specific
|
|
|
4453 |
platforms that have 64-bit <b><tt>long</tt></b> values, we define a macro
|
|
|
4454 |
<b><tt>ARCH_SIZEOF_LONG</tt></b> that can then be tested. Such macros are
|
|
|
4455 |
always defined in a .h file, either automatically in <b><tt>arch.h</tt></b>,
|
|
|
4456 |
or explicitly in a <em>xxx</em><b><tt>_.h</tt></b> file, as described in
|
|
|
4457 |
earlier sections.
|
|
|
4458 |
|
|
|
4459 |
<dl>
|
|
|
4460 |
<dt>
|
|
|
4461 |
Files:
|
|
|
4462 |
<dd>
|
|
|
4463 |
<a href="../src/std.h">src/std.h</a>,
|
|
|
4464 |
<a href="../src/stdpn.h">src/stdpn.h</a>,
|
|
|
4465 |
<a href="../src/stdpre.h">src/stdpre.h</a>.
|
|
|
4466 |
</dl>
|
|
|
4467 |
|
|
|
4468 |
<h4><a name="Implicit_dependencies"></a>Implicit dependencies</h4>
|
|
|
4469 |
|
|
|
4470 |
<p>
|
|
|
4471 |
The most common source of byte ordering dependencies is casting between
|
|
|
4472 |
types (T1 *) and (T2 *) where T1 and T2 are numeric types that aren't merely
|
|
|
4473 |
signed/unsigned variants of each other. To avoid this, the only casts
|
|
|
4474 |
allowed in the code are between numeric types, from a pointer type to a long
|
|
|
4475 |
integral type, and between pointer types.
|
|
|
4476 |
|
|
|
4477 |
<p>
|
|
|
4478 |
Ghostscript's code assumes the following about the sizes of various types:
|
|
|
4479 |
|
|
|
4480 |
<dl>
|
|
|
4481 |
<dt>char<dd>8 bits
|
|
|
4482 |
<dt>short<dd>16 bits
|
|
|
4483 |
<dt>int<dd>32 or 64 bits
|
|
|
4484 |
<dt>long<dd>32 or 64 bits
|
|
|
4485 |
<dt>float<dd>32 bits (may work with 64 bits)
|
|
|
4486 |
<dt>double<dd>64 bits (may work with 128 bits)
|
|
|
4487 |
</dl>
|
|
|
4488 |
|
|
|
4489 |
<p>
|
|
|
4490 |
The code does not assume that the <b><tt>char</tt></b> type is signed (or
|
|
|
4491 |
unsigned); except for places where the value is always a literal string, or
|
|
|
4492 |
for interfacing to library procedures, the code uses <b><tt>byte</tt></b> (a
|
|
|
4493 |
Ghostscript synonym for <b><tt>unsigned char</tt></b>) almost everywhere.
|
|
|
4494 |
|
|
|
4495 |
<p>
|
|
|
4496 |
Pointers are signed on some platforms and unsigned on others. In the few
|
|
|
4497 |
places in the memory manager where it's necessary to reliably order-compare
|
|
|
4498 |
(as opposed to equality-compare) pointers that aren't known to point to the
|
|
|
4499 |
same allocated block of memory, the code uses the
|
|
|
4500 |
<b><tt>PTR_</tt></b><em>relation</em> macros rather than direct comparisons.
|
|
|
4501 |
|
|
|
4502 |
<p>
|
|
|
4503 |
See the files listed above for other situations where a macro provides
|
|
|
4504 |
platform-independence or a workaround for bugs in specific compilers or
|
|
|
4505 |
libraries (of which there are a distressing number).
|
|
|
4506 |
|
|
|
4507 |
<h4><a name="Platform_specific_code"></a>Platform-specific code</h4>
|
|
|
4508 |
|
|
|
4509 |
<p>
|
|
|
4510 |
There are some features that are inherently platform-specific:
|
|
|
4511 |
|
|
|
4512 |
<ul>
|
|
|
4513 |
|
|
|
4514 |
<li>Microsoft Windows requires a lot of special top-level code, and also has
|
|
|
4515 |
an installer and uninstaller.
|
|
|
4516 |
|
|
|
4517 |
<li>OS/2 requires a little special code.
|
|
|
4518 |
|
|
|
4519 |
<li>MacOS also requires special top-level code (now distributed with the
|
|
|
4520 |
standard Ghostscript package).
|
|
|
4521 |
|
|
|
4522 |
<li>All platforms supporting DLLs (currently all three of the above) share
|
|
|
4523 |
some special top-level code.
|
|
|
4524 |
|
|
|
4525 |
</ul>
|
|
|
4526 |
|
|
|
4527 |
<dl>
|
|
|
4528 |
|
|
|
4529 |
<dt>
|
|
|
4530 |
MS Windows files:
|
|
|
4531 |
<dd>
|
|
|
4532 |
<a href="../src/dpmain.c">src/dpmain.c</a>,
|
|
|
4533 |
<a href="../src/dwdll.c">src/dwdll.c</a>,
|
|
|
4534 |
<a href="../src/dwdll.h">src/dwdll.h</a>,
|
|
|
4535 |
<a href="../src/dwimg.c">src/dwimg.c</a>,
|
|
|
4536 |
<a href="../src/dwimg.h">src/dwimg.h</a>,
|
|
|
4537 |
<a href="../src/dwinst.cpp">src/dwinst.cpp</a>,
|
|
|
4538 |
<a href="../src/dwinst.h">src/dwinst.h</a>,
|
|
|
4539 |
<a href="../src/dwmain.c">src/dwmain.c</a>,
|
|
|
4540 |
<a href="../src/dwmain.h">src/dwmain.h</a>,
|
|
|
4541 |
<a href="../src/dwmainc.c">src/dwmainc.c</a>,
|
|
|
4542 |
<a href="../src/dwnodll.c">src/dwnodll.c</a>,
|
|
|
4543 |
<a href="../src/dwreg.c">src/dwreg.c</a>,
|
|
|
4544 |
<a href="../src/dwreg.h">src/dwreg.h</a>,
|
|
|
4545 |
<a href="../src/dwsetup.cpp">src/dwsetup.cpp</a>,
|
|
|
4546 |
<a href="../src/dwsetup.h">src/dwsetup.h</a>,
|
|
|
4547 |
<a href="../src/dwtext.c">src/dwtext.c</a>,
|
|
|
4548 |
<a href="../src/dwtext.h">src/dwtext.h</a>,
|
|
|
4549 |
<a href="../src/dwtrace.c">src/dwtrace.c</a>,
|
|
|
4550 |
<a href="../src/dwtrace.h">src/dwtrace.h</a>,
|
|
|
4551 |
<a href="../src/dwuninst.cpp">src/dwuninst.cpp</a>,
|
|
|
4552 |
<a href="../src/dwuninst.h">src/dwuninst.h</a>,
|
|
|
4553 |
<a href="../src/gp_msdll.c">src/gp_msdll.c</a>,
|
|
|
4554 |
<a href="../src/gp_mspol.c">src/gp_mspol.c</a>,
|
|
|
4555 |
<a href="../src/gp_msprn.c">src/gp_msprn.c</a>,
|
|
|
4556 |
<a href="../src/gs16spl.c">src/gs16spl.c</a>,
|
|
|
4557 |
<a href="../src/gsdllwin.h">src/gsdllwin.h</a>.
|
|
|
4558 |
|
|
|
4559 |
<dt>
|
|
|
4560 |
OS/2 files:
|
|
|
4561 |
<dd>
|
|
|
4562 |
<a href="../src/gp_os2pr.c">src/gp_os2pr.c</a>,
|
|
|
4563 |
<a href="../src/gsdllos2.h">src/gsdllos2.h</a>.
|
|
|
4564 |
|
|
|
4565 |
<dt>
|
|
|
4566 |
Unix files:
|
|
|
4567 |
<dd>
|
|
|
4568 |
<a href="../src/dxmain.c">src/dxmain.c</a>,
|
|
|
4569 |
<a href="../src/dxmainc.c">src/dxmainc.c</a>.
|
|
|
4570 |
|
|
|
4571 |
<dt>
|
|
|
4572 |
Macintosh files:
|
|
|
4573 |
<dd>
|
|
|
4574 |
<a href="../src/gdevmac.c">src/gdevmac.c</a>,
|
|
|
4575 |
<a href="../src/gdevmac.h">src/gdevmac.h</a>,
|
|
|
4576 |
<a href="../src/gdevmacpictop.h">src/gdevmacpictop.h</a>,
|
|
|
4577 |
<a href="../src/gdevmacttf.h">src/gdevmacttf.h</a>,
|
|
|
4578 |
<a href="../src/gdevmacxf.c">src/gdevmacxf.c</a>,
|
|
|
4579 |
<a href="../src/gp_mac.c">src/gp_mac.c</a>,
|
|
|
4580 |
<a href="../src/gp_mac.h">src/gp_mac.h</a>,
|
|
|
4581 |
<a href="../src/gp_macio.c">src/gp_macio.c</a>,
|
|
|
4582 |
<a href="../src/gp_macpoll.c">src/gp_macpoll.c</a>,
|
|
|
4583 |
<a href="../src/gsiomacres.c">src/gsiomacres.c</a>,
|
|
|
4584 |
<a href="../src/macgenmcpxml.sh">src/macgenmcpxml.sh</a>,
|
|
|
4585 |
<a href="../src/macsystypes.h">src/macsystypes.h</a>,
|
|
|
4586 |
<a href="../src/macos_carbon_pre.h">src/macos_carbon_pre.h</a>,
|
|
|
4587 |
<a href="../src/macos_carbon_d_pre.h">src/macos_carbon_d_pre.h</a>,
|
|
|
4588 |
<a href="../src/macos_classic_d_pre.h">src/macos_classic_d_pre.h</a>,
|
|
|
4589 |
|
|
|
4590 |
<a href="../src/dmmain.c">src/dmmain.c</a>,
|
|
|
4591 |
<a href="../src/dmmain.r">src/dmmain.r</a>.
|
|
|
4592 |
|
|
|
4593 |
<dt>
|
|
|
4594 |
VMS files:
|
|
|
4595 |
<dd>
|
|
|
4596 |
<a href="../src/vms_x_fix.h">src/vms_x_fix.h</a>.
|
|
|
4597 |
|
|
|
4598 |
<dt>
|
|
|
4599 |
DLL files:
|
|
|
4600 |
<dd>
|
|
|
4601 |
<a href="../src/gsdll.c">src/gsdll.c</a>,
|
|
|
4602 |
<a href="../src/gsdll.h">src/gsdll.h</a>,
|
|
|
4603 |
<a href="../src/gdevdsp.c">src/gdevdsp.c</a>,
|
|
|
4604 |
<a href="../src/gdevdsp.h">src/gdevdsp.h</a>,
|
|
|
4605 |
<a href="../src/gdevdsp2.h">src/gdevdsp2.h</a>,
|
|
|
4606 |
<a href="../src/iapi.c">src/iapi.c</a>,
|
|
|
4607 |
<a href="../src/iapi.h">src/iapi.h</a>,
|
|
|
4608 |
<a href="../src/idisp.c">src/idisp.c</a>,
|
|
|
4609 |
<a href="../src/idisp.h">src/idisp.h</a>.
|
|
|
4610 |
<p>
|
|
|
4611 |
The new DLL interface (new as of 7.0) is especially useful with the
|
|
|
4612 |
new display device, so it is included here. Both are due to Russell
|
|
|
4613 |
Lang.
|
|
|
4614 |
|
|
|
4615 |
</dl>
|
|
|
4616 |
|
|
|
4617 |
|
|
|
4618 |
<hr>
|
|
|
4619 |
|
|
|
4620 |
<h2><a name="Adding_features_and_options"></a>Adding features and options</h2>
|
|
|
4621 |
|
|
|
4622 |
<p>
|
|
|
4623 |
[Ray, please supply more information about what you want here]
|
|
|
4624 |
|
|
|
4625 |
<h2><a name="Troubleshooting"></a>Troubleshooting</h2>
|
|
|
4626 |
|
|
|
4627 |
<p>
|
|
|
4628 |
The Ghostscript code has many tracing and debugging features that can be
|
|
|
4629 |
enabled at run time using the <b><tt>-Z</tt></b> command line switch, if the
|
|
|
4630 |
executable was compiled with <b><tt>DEBUG</tt></b> defined. One
|
|
|
4631 |
particularly useful combination is <b><tt>-Z@\?</tt></b>, which fills free
|
|
|
4632 |
memory blocks with a pattern and also turns on run-time memory consistency
|
|
|
4633 |
checking. For more information, see <a
|
|
|
4634 |
href="Use.htm#Debugging">doc/Use.htm#Debugging</a>; you can also search for
|
|
|
4635 |
occurrences of <b><tt>if_debug</tt></b> or <b><tt>gs_debug_c</tt></b> in the
|
|
|
4636 |
source code. Note that many of these features are in the graphics library
|
|
|
4637 |
and do not require a PostScript interpreter.
|
|
|
4638 |
|
|
|
4639 |
<p>
|
|
|
4640 |
The code also contains many run-time procedures whose only purpose is to be
|
|
|
4641 |
called from the debugger to print out various data structures, including all
|
|
|
4642 |
the procedures in <a href="../src/idebug.c">src/idebug.c</a> (for the
|
|
|
4643 |
PostScript interpreter) and the <b><tt>debug_dump_</tt></b> procedures in <a
|
|
|
4644 |
href="../src/gsmisc.c">src/gsmisc.c</a>.
|
|
|
4645 |
|
|
|
4646 |
<dl>
|
|
|
4647 |
<dt>
|
|
|
4648 |
Files:
|
|
|
4649 |
<dd>
|
|
|
4650 |
<a href="Use.htm#Debugging">doc/Use.htm#Debugging</a>,
|
|
|
4651 |
<a href="../src/gdebug.h">src/gdebug.h</a>,
|
|
|
4652 |
<a href="../src/gsmdebug.h">src/gsmdebug.h</a>,
|
|
|
4653 |
<a href="../src/idebug.h">src/idebug.h</a>,
|
|
|
4654 |
<a href="../src/idebug.c">src/idebug.c</a>.
|
|
|
4655 |
</dl>
|
|
|
4656 |
|
|
|
4657 |
<!-- [2.0 end contents] ==================================================== -->
|
|
|
4658 |
|
|
|
4659 |
<!-- [3.0 begin visible trailer] =========================================== -->
|
|
|
4660 |
<hr>
|
|
|
4661 |
|
|
|
4662 |
<p>
|
|
|
4663 |
<small>Copyright © 2001 artofcode LLC.
|
|
|
4664 |
All rights reserved.</small>
|
|
|
4665 |
|
|
|
4666 |
<p>
|
|
|
4667 |
This software is provided AS-IS with no warranty, either express or
|
|
|
4668 |
implied.
|
|
|
4669 |
|
|
|
4670 |
This software is distributed under license and may not be copied,
|
|
|
4671 |
modified or distributed except as expressly authorized under the terms
|
|
|
4672 |
of the license contained in the file LICENSE in this distribution.
|
|
|
4673 |
|
|
|
4674 |
For more information about licensing, please refer to
|
|
|
4675 |
http://www.ghostscript.com/licensing/. For information on
|
|
|
4676 |
commercial licensing, go to http://www.artifex.com/licensing/ or
|
|
|
4677 |
contact Artifex Software, Inc., 101 Lucas Valley Road #110,
|
|
|
4678 |
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
|
|
|
4679 |
|
|
|
4680 |
<p>
|
|
|
4681 |
<small>Ghostscript version 8.53, 20 October 2005
|
|
|
4682 |
|
|
|
4683 |
<!-- [3.0 end visible trailer] ============================================= -->
|
|
|
4684 |
|
|
|
4685 |
</small></body>
|
|
|
4686 |
</html>
|