xref: /plan9/sys/src/cmd/gs/doc/Projects.htm (revision ff8c3af2f44d95267f67219afa20ba82ff6cf7e4)
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>Ghostscript projects</title>
5<!-- $Id: Projects.htm,v 1.33.2.2 2002/02/01 05:31:25 raph Exp $ -->
6<link rel="stylesheet" type="text/css" href="gs.css" title="Ghostscript Style">
7</head>
8
9<body>
10<!-- [1.0 begin visible header] ============================================ -->
11
12<!-- [1.1 begin headline] ================================================== -->
13
14<h1>Ghostscript projects seeking 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<ul>
23<li><a href="#Platforms">Platforms</a>
24<li><a href="#Driver_architecture">Driver architecture</a>
25<li><a href="#Specific_drivers">Specific drivers</a>
26<li><a href="#Graphics_functionality">Graphics functionality</a>
27<li><a href="#Performance">Performance</a>
28<li><a href="#Other_functionality">Other functionality</a>
29<li><a href="#Other_implementation">Implementation improvements</a>
30</ul>
31
32<!-- [1.2 end table of contents] =========================================== -->
33
34<!-- [1.3 begin hint] ====================================================== -->
35
36<p>For other information, see the <a href="Readme.htm">Ghostscript
37overview</a>.
38
39<!-- [1.3 end hint] ======================================================== -->
40
41<hr>
42
43<!-- [1.0 end visible header] ============================================== -->
44
45<!-- [2.0 begin contents] ================================================== -->
46
47<p>
48There are many projects that would improve Ghostscript and that we would
49like to do, but for which we don't have enough resources.  If you would like
50to take responsibility for any of these projects, please <a
51href="mailto:raph@artofcode.com">contact us</a>.  Additional comments on
52implementation approaches or project goals are in <I>italic type like
53this</I>.
54
55<h2><a name="Platforms"></a>Additional platforms</h2>
56
57<h3>DOS, Windows and OS/2 builds using gcc.</h3>
58
59<p>
60We would like Ghostscript to work with the free <b><tt>emx/gcc</tt></b> and
61<b><tt>rsx</tt></b> libraries, to provide an alternative DOS, Windows
6295/98/NT, and OS/2 implementation that requires no proprietary, commercial
63compilers.  We think Ghostscript's existing OS/2 makefile already includes
64most of what is needed.  If someone is willing to do the work, we will be
65happy to include this in our list of supported platforms and to distribute
66the makefiles.
67
68<h3>Windows driver using Ghostscript as a language monitor.</h3>
69
70<p>
71MS Windows has a "language monitor" capability which would allow Ghostscript
72to be invoked seamlessly to process input files in any language Ghostscript
73could handle (currently PostScript and PDF) and for any printer for which
74Ghostscript had a driver.  Doing this properly would require integrating
75Ghostscript with Windows' "Add Printer" dialog, and would also require
76creating a PPD for Ghostscript.  <I>Russell Lang's RedMon program provides
77some, but not all, of this capability.</I>
78
79<h3>Netscape browser plug-in.</h3>
80
81<p>
82Currently, Ghostscript can work as a "helper application" for the Netscape
83browser, but not as a plug-in; the latter would integrate it more closely
84with the browser.  We aren't sure what doing this would involve; we've also
85heard by rumor that it's already been done.
86
87<h3>Ghostscript as an Active-X COM Object.</h3>
88
89<p>
90In order to integrate Ghostscript into XMetaL and other applications it
91would be convenient for Ghostscript to be distributed as a COM object
92along with the current gswin32.exe, gswin32c.exe and gsdll32.dll files.
93
94<hr>
95
96<h2><a name="Driver_architecture"></a>Driver Architecture</h2>
97
98<h3>Improved multi-threaded rendering support.</h3>
99
100<p>
101Currently, drivers can be written so that converting PostScript to a list of
102graphical objects can run in one thread, and rasterizing the objects can run
103in another thread.  However, drivers must be written specially if they are
104going to do this.  We would like to change the architecture so that any
105driver can work this way.  We would also like to support dual-threaded
106operation for drivers that produce high-level output, such as the PDF
107writer.  <I>Doing this would require separating banding from
108the multithreaded logic.  Also, currently each thread has its own allocation
109pool: this is unnecessary in the normal case, since Ghostscript now supports
110properly locked access to the C heap, but embedded systems still need to use
111a fixed-size area for the rasterizing thread.  With a locked, shared
112allocator, the rasterizing thread could use the full set of band list
113functions; with a fixed-size area and a separate allocator, only a subset is
114available, as is the case now for dual-threaded drivers.
115</I>
116
117<h3>Dynamic run-time loadable devices.</h3>
118
119<p>
120Currently, drivers must be linked into the executable.  We would like to be
121able to load drivers dynamically.  Doing this requires defining a
122platform-independent API (presumably extending the current gp_* APIs) that
123would work at least on Linux, vendor Unix, MS Windows, and Macintosh.  Unix
124systems should include Sun, HP, AIX, IRIX, DEC; Linux ELF and a.out formats
125should both be supported.  <I>Consider the Netscape plug-in
126architecture.</I>
127
128<h3>Moving 'setpagedevice' into C.</h3>
129
130<p>
131The PostScript 'setpagedevice' function implements matching of media and
132page size requests to available media, page orientation, and paper handling
133(duplex, etc.)  Currently it is implemented in PostScript code, which means
134it is not available for use with other input languages.  (It is available
135for PDF, which Ghostscript implements on top of PostScript, but not for the
136not-yet-freely-available PCL interpreters that use the Ghostscript library,
137or for possible future SVG or similar interpreters).  We would like to move
138this function into C.  <I>The device driver will be required to
139send page parameters up to PostScript to be stored in a resource.  To be
140included in this project are handling policy implementations in the device
141drivers.  DeferredMediaSelection should also be implemented.</I>
142
143<h3>Adding 'tee' for output to multiple devices.</h3>
144
145<p>
146In a few cases, it would be desirable to provide a 'tee' capability for
147drivers: specifically, for generating small, low-resolution 'thumbnail'
148images concurrently with other output.  <I>Probably the
149simplest way to do this is to generate a band list and then process it
150twice.  This is not completely trivial, since the band list does include
151device resolution information and scaling would be required for some
152constructs.</I>
153
154<h3><b><tt>OutputDevice</tt></b> resource category</h3>
155
156<p>
157Each available output device should provide an instance of the
158<b><tt>OutputDevice</tt></b> resource category, which gives the available
159page sizes, resolutions, media classes, process color models, and other
160information about the device.  <I>This would replace the current
161non-standard use of a 4-element <b><tt>PageSize</tt></b> in the
162<b><tt>InputAttributes</tt></b> entry of the page device dictionary.</I>
163
164<h3>Removing the limit on the length of OutputFile.</h3>
165
166<p>
167Currently, the maximum length of the <b><tt>OutputFile</tt></b> parameter is
168a compile-time constant, <b><tt>gp_file_name_sizeof</tt></b>.  This is
169appropriate for ordinary file names, since this constant is the platform's
170limit on the length of a file name.  However, if <b><tt>OutputFile</tt></b>
171is a pipe, the length should not be limited in this way.  <I>This is
172probably a small project: it requires allocating the file name dynamically,
173and freeing it in the finalization routine that gets called when a driver
174instance is freed.</I>.
175
176<h2><a name="Specific_drivers"></a>Specific drivers</h2>
177
178<h3>PrintGear and PPA output drivers.</h3>
179
180<p>
181We would like to provide (Adobe) PrintGear and (H-P) PPA output drivers for
182Ghostscript, but the specifications for these protocols are not published.
183If you can provide them to us without violating any agreements, please let
184us know.  (Some work has already been done on reverse-engineering these
185protocols, but we don't have references to it.)
186
187<h3>Improve 'pswrite' up to the level of 'pdfwrite'.</h3>
188
189<p>
190We would like to improve the high-level PostScript-writing
191<b><tt>pswrite</tt></b> driver to bring it up to parity with the PDF-writing
192driver (including the many improvements in the latter being implemented in
193Ghostscript 7.xx).  Specifically, we want it to write text as text rather
194than bitmaps, and to consistently write images in their original high-level
195form.  <I>We have already started to factor out code that
196should be common to these two drivers, specifically for writing embedded
197fonts and compressed data streams.</I>
198
199<p>
200There is one small part of this project that would be especially valuable
201and could be done independently (although it might have to be partly or
202entirely redone later): compressing images.  Currently the driver only
203compresses character bitmaps, and doesn't compress other images at all.
204<I>It should use the <b><tt>CCITTFaxEncode</tt></b> filter for 1-bit-deep
205images, and plane-separated <b><tt>LZWEncode</tt></b> compression for color
206images, using the <b><tt>miGIF</tt></b> algorithms that are believed to be
207free of the Welch patent for the latter.  When generating LL3 PS, the
208<b><tt>Flate</tt></b> compression will work better than miGIF. It may be
209worth trying several methods on each image and use the one that works best.</I>
210
211<h3>High level graphics and text for PCL 5 and PCL XL drivers.</h3>
212
213<p>
214Currently, the PCL 5 drivers produce only bitmaps; the PCL XL driver
215produces high-level graphics and sometimes high-level images, but low-level
216text.  We would like to improve these drivers to produce higher-level,
217smaller output.  <I>This was a very low-priority project; it has become more
218important now that H-P's laser printers are shipping with less memory.</I>
219
220<h3>Improved high level GDI driver for Windows.</h3>
221
222<p>
223We would like a "GDI driver" for MS Windows that would implement more
224higher-level constructs (specifically for text).  <I> The
225<b><tt>mswin</tt></b> and <b><tt>mswinprn</tt></b> drivers both do some of
226this.  Some of the the 'xfont' support code for MS Windows should be useful.
227We were frustrated in the past because the GDI calls for getting font sizes
228and metrics consistently returned incorrect information and provided no way
229to get the correct information; perhaps this has been fixed in 32-bit
230Windows.  We believe that H-P, Russell Lang, and perhaps others are working
231in this area, but we can always use more help.</I>
232
233<h3>PDF thumbnail generation.</h3>
234
235<p>
236The PDF writer needs to be able to generate thumbnails (small previews).  We
237might do this through the 'tee' capability mentioned above.  However, we
238currently prefer the idea of implementing a completely separate program to
239add thumbnails to an arbitrary, existing PDF file: this would allow
240Ghostscript to add thumbnails to PDF files generated by other programs.
241<I>Much of the code needed to do this has already been written
242for Ghostscript's PDF linearizer: see
243<b><tt>lib/pdfwrite.ps</tt></b>.  A user has implemented this as well,
244using a separate program that calls Ghostscript: see
245<a href="http://www.uni-giessen.de/~g029/eurotex99/oberdiek/">
246http://www.uni-giessen.de/~g029/eurotex99/oberdiek/</a>.
247</I>
248
249<h3>Consolidate inkjet drivers into a single family.</h3>
250
251<p>
252In addition to factoring out the error diffusion code as described below, we
253would like to see another attempt at reducing the enormous volume of code
254for color inkjet drivers.  There are three sets of drivers (gdevcdj.c,
255gdevstc.c, gdevupd.c) with much overlapping functionality.  The latter two
256driver families make good attempts at factoring out things like head
257geometry and canned control strings, but we think this problem deserves
258another pass, especially in the hope of consolidating these drivers into a
259single family.
260
261<h3>Download glyph bitmaps (with glyph decaching notification).</h3>
262
263<p>
264See below under "Notification for glyph decaching."
265
266<h3>Preserve compression when writing PDF images.</h3>
267
268<p>
269Currently, all images are decompressed by the interpreter before being
270passed to the graphics library; the PDF writer may then compress them again.
271Ordinarily, this only slows things down a little, but in the case of
272DCT-encoded images that are being DCT-encoded in the output, image
273degradation may occur.  Ideally, the implementation should be smart enough
274to not decode and re-encode the image.  However, making this work properly
275is difficult.  <I>This would probably involve extending the library APIs for
276images so that they could pass a stream, possibly including filters, instead
277of the (fully decoded) data rows.</I>
278
279<hr>
280
281<h2><a name="Graphics_functionality"></a>Graphics functionality</h2>
282
283<h3>Support for 64-bit colors on 64-bit platforms.</h3>
284
285<p>
286Currently, the library supports a maximum of 32 bits of data per pixel; we
287would like to raise this limit to 64 bits on systems where the 'long' data
288type is 64 bits wide.  <I>The <b><tt>gx_color_index</tt></b>
289type is already defined as 'long', but there are many places where the type
290<b><tt>bits32</tt></b> is used for pixel values; there is a 32-bit
291stored-image "device", but there is no 64-bit device; a few algorithms and
292tables have knowledge of the 32-bit width built into them, only because the
293C preprocessor doesn't have any kind of loop or repetition
294capability.</I>
295
296<h3>In-RIP trapping.</h3>
297
298<p>
299The PostScript specification includes an option for the interpreter to
300implement trapping (adjustments of object boundaries to prevent visual
301anomalies caused by slight misregistration of different ink layers): we
302would like to implement this.  <I>This is a complex and
303difficult area; even many Adobe RIPs don't do it.</I>
304
305<h3>Hook FreeType TrueType library into graphics library.</h3>
306
307<p>
308We would like to provide an option for good integration of the FreeType font
309rasterizer into Ghostscript, since the FreeType code is better than
310Ghostscript's current rasterizers.  We understand that some users in Japan
311have done this already, but we don't know if this is a good starting point
312(the only documentation is in Japanese).  <I>Their work uses
313Ghostscript's 'xfont' interface, which is how Ghostscript interfaces to
314platform facilities such as the X and MS Windows font capabilities.  This is
315a device-level interface and not the best place to do this: we would rather
316have the graphics library interface to FreeType directly.</I>
317
318<h3>ICC profile support for output.</h3>
319
320<p>
321Ghostscript 7.00 and later supports ICCBased color spaces of PDF
322using the icclib package from
323<a href="http://web.access.net.au/argyll/color.html ">
324http://web.access.net.au/argyll/color.html</a>
325but there is no facility to use ICC output (printer) profiles that
326may be embedded in the PDF. Also it would be useful for PostScript
327to be able to directly use a specific Intent from ICC profile to
328convert output colors (as CRD's are now used).
329<I>The primary difficulty is that the graphics library and PostScript
330always use CIE XYZ as the connection space, but ICC profiles may
331use CIELAB as the connection space, requiring conversion for use
332with the graphics library. </I>
333
334<h3>Making halftones into "objects" and adding new types.</h3>
335
336<p>
337Currently, knowledge of the specific data formats and algorithms for
338halftoning permeates too many places in the library.  We would like
339halftoning to be more "object oriented" (using virtual procedures) so that
340we could support other halftoning methods such as direct use of threshold
341arrays, or the double-rectangle approach added in newer PostScript versions.
342<I>Threshold arrays take much less space than the current
343representation, generally at the expense of longer rendering time for
344black-and-white images; double-rectangle representation would give us a
345better implementation of AccurateScreens.  We might want store both
346threshold arrays and the current representation.</I>
347
348<h3>Factor out error diffusion routines, integrate ETS.</h3>
349
350<p>
351Currently, several different inkjet drivers implement their own, very
352similar but slightly differing error diffusion methods.  This has caused
353severe code bloat as well as tempting future driver writers to contribute to
354it further.  We want to factor out error diffusion into a common set of
355facilities that drivers can use.  <I>We would like to design
356these facilities so that they can easily interface to the Even-Toned
357Screening algorithms from artofcode (Raph Levien), to the extent that these
358will be Open Source.</I>
359
360<h3>Improve, or generalize, linearization for stochastic threshold
361data.</h3>
362
363<p>
364The Ghostscript distribution includes a stochastic threshold array.  This
365array has some gamma correction built into it, which works well for some
366output devices and not for others.  We would like to provide a version of
367this array without (or with less) gamma correction.  <I>We have
368original data available from which this could be done fairly easily.</I>
369
370<h3>Change sampled functions to use new interpreted functions.</h3>
371
372<p>
373The PostScript language defines many functions relevant to graphics
374rendering as being implemented by arbitrary PostScript procedures: transfer
375(gamma correction), black generation, undercolor removal, several stages of
376CIE color space and rendering, and color mapping for Separation and DeviceN
377spaces.  Since the graphics library can't call PostScript procedures,
378Ghostscript currently samples these procedures at a fixed number of points
379and interpolates linearly between the samples.  As of Ghostscript 6.20, the
380library can interpret a restricted subset of PostScript procedures directly
381(basically those that only use arithmetic and comparisons: no loops,
382sub-procedures, or data structures).  Changing the rendering functions to
383use this approach when possible would greatly improve output quality when
384the functions are very non-linear (which we have actually seen in practice).
385<I>This should only be done if the function is, in fact,
386severely non-linear, since interpreting the function definition will almost
387always be much slower than interpolating in the table.</I>
388
389<h3>Add optional cubic interpolation to RenderTable and other table
390lookup.</h3>
391
392<p>
393Currently, if a CIE rendering dictionary uses a lookup table for the final
394step, Ghostscript always interpolates linearly between the entries.  Cubic
395interpolation should be supported as an option.  A cubic interpolation
396option is also needed for general table-lookup Functions.
397
398<h3>Add better (SVG-like) alpha channel and compositing to library.</h3>
399
400<p>
401Ghostscript has partial support for alpha channel and for alpha and RasterOp
402compositing.  There is some architectural support for general compositing,
403but it postdates the RasterOp implementation, and most of the RasterOp code
404doesn't use it.  We expect that the more extensive compositing and alpha
405capabilities of SVG will find their way into PDF (and probably PostScript as
406well) in the course of 2000 and 2001, and we will need to implement them.
407
408<hr>
409
410<h2><a name="Performance"></a>Performance</h2>
411
412<h3>Change band list logic to defer halftoning until rendering.</h3>
413
414<p>
415Currently, when Ghostscript uses a band list, it does halftoning before
416banding.  It should do halftoning after banding: this produces smaller band
417lists and shifts more work to the rasterizer (which is good because the
418rasterizer can be multi-threaded internally for higher performance on
419multiprocessors: see the next topic.)
420
421<h3>Reduce redundant data for smoothed banded images.</h3>
422
423<p>
424When smoothed ("interpolated") images are written in the band list, extra
425rows must be written above and below each band in order to provide the data
426for interpolation.  Currently, the number of such rows is computed very
427conservatively; instead, the final interpolation algorithm should be
428consulted to provide the correct value.  <i>This is a small task.</i>
429
430<h3>Multi-threaded rasterizing</h3>
431
432<p>
433For high-resolution devices, rasterization dominates execution time.  On
434multiprocessor systems, Ghostscript can do tasks in parallel:
435
436<ul>
437
438<li>Rasterize multiple bands simultaneously;
439
440<li>Rasterize multiple color planes of a single band simultaneously (if a
441planar representation is being used);
442
443<li>For some computation-intensive tasks like smoothing images or filling
444large regions, partition the task (possibly buffering more data to allow
445larger-grain partitioning) and execute several partitions simultaneously.
446
447</ul>
448
449<p>
450We would want these facilities implemented so that no conditional
451compilation was involved: on uniprocessor systems, the locking API would
452simply have a vacuous implementation.
453
454<h3>Notification for glyph decaching.</h3>
455
456<p>
457Currently, drivers can't do a very good job of downloading rendered
458character bitmaps to the device they manage, because they can't find out
459when a bitmap is being deleted from Ghostscript's cache and therefore will
460never be referenced again.  Here is a sketch of how we would add this
461capability to the graphics library:
462
463<ul>
464
465<li>The driver would implement the <b><tt>text_begin</tt></b> call, simply
466to get access to a <b><tt>gs_imager_state</tt></b> that references the
467rendered character cache.  (The driver could always simply call the default
468implementation of <b><tt>text_begin</tt></b>.)
469
470<li>In the <b><tt>text_begin</tt></b> procedure, the driver would call
471
472<blockquote><pre>
473gs_glyph_decache_register(imager_state, notify_proc, proc_data)
474</pre></blockquote>
475
476<p>
477where <b><tt>proc_data</tt></b> was, or pointed to a structure that
478included, a pointer to the driver.
479
480<li><b><tt>gs_glyph_decache_register</tt></b> would use the general
481notification mechanism defined in <b><tt>gsnotify.h</tt></b> to call
482
483<blockquote><pre>
484notify_proc(proc_data, pchar_data)
485</pre></blockquote>
486
487<p>
488whenever a bitmap was removed from the character cache.
489<b><tt>pchar_data</tt></b> would point to some identification of the
490character; perhaps just the bitmap ID, but possibly a
491<b><tt>gx_cached_bits_common</tt></b> or even a <b><tt>cached_char</tt></b>.
492
493<li>The <b><tt>char_cache</tt></b> structure would be need an additional
494member, a <b><tt>gs_notify_list_t</tt></b>.  It would also need to add
495finalization so that when it was freed, it would notify and unregister all
496clients, using <b><tt>gs_notify_all(list, NULL)</tt></b> and then
497<b><tt>gs_notify_release</tt></b>.
498
499</ul>
500
501<p>
502<I>This facility was requested by the Display Ghostscript project, but it
503could also be used to improve the output of the PCL XL driver and possibly
504the X and PCL5 drivers.</I>
505
506<hr>
507
508<h2><a name="Other_functionality"></a>Other functionality</h2>
509
510<h3>OpenStep (Display PostScript + NeXT) extensions to Ghostscript.</h3>
511
512<p>
513There is a project to create a GNU implementation of the OPENStep API, which
514involves extending Ghostscript to provide the full functionality of Adobe's
515Display PostScript system with some of the NeXT extensions.  For more
516information, please contact Net-Community &lt;<a
517href="mailto:scottc@net-community.com">scottc@net-community.com</a>&gt;.
518
519<h3>Job Server implementation.</h3>
520
521<p>
522For full Adobe PostScript compatibility, Ghostscript needs a real "job
523server" to encapsulate the execution of PostScript files.
524<I>See the section on "Job Execution Environment" in the PostScript
525Language Reference Manual for details.</I>
526
527<h3>SVG (XML Structured Vector Graphics) interpreter.</h3>
528
529<p>
530Ghostscript could be adapted with some work to read SVG.  This would be an
531interesting and challenging project because SVG's graphics model would
532require extending the library (see above).  <I>If SVG turns out to be an
533important standard, it is important that there be a good free implementation
534of it.</I>
535
536<h3><b><tt>%font%</tt></b> and other IODevices.</h3>
537
538<p>
539Currently, the <b><tt>%font%</tt></b> IODevice is not implemented.  We would
540like to see this implemented using a general framework for implementing
541IODevices (%xxxx%) entirely in PostScript, in an "object oriented" manner
542very similiar to the way Resource categories are implemented.  An IODevice
543would be implemented as a dictionary with the following keys, whose values
544would be procedures that implemented the corresponding operation:
545
546<blockquote><pre>
547/File
548/DeleteFile
549/RenameFile
550/Status
551/FileNameForAll
552/GetDevParams
553/PutDevParams
554</pre></blockquote>
555
556<p>
557There would only be global IODevices, no local ones; the dictionary keeping
558track of them would be stored in global VM.
559
560<p>
561<I>This is an obscure feature that matters only because some PostScript code
562uses <b><tt>filenameforall</tt></b> with this IODevice, rather than
563<b><tt>filenameforall</tt></b> with the <b><tt>/Font</tt></b> Resource
564category, to enumerate available fonts.</I>
565
566<h3>Repairing damaged or EOL-converted PDF files.</h3>
567
568<p>
569Adobe Acrobat Reader can scan a PDF file that has had its end-of-lines
570converted by careless users transferring the file across operating systems
571as text rather than binary across, and reconstruct the cross-reference table
572which the PDF interpreter requires.  This only works if the file has no
573binary data in it, which with PDF 1.3 is rarely the case.  However, users
574occasionally receive PDF files that have been damaged in this way, and it
575might be useful to have a program that can repair them.  <I>We think this
576should probably be done as a separate program, possibly in PostScript,
577similar to Ghostscript's PDF linearizer.</I>
578
579<h2><a name="Other_implementation"></a>Implementation improvements</h2>
580
581<h3>Fully re-entrant code.</h3>
582
583<p>
584Currently, neither the PostScript interpreter nor the graphics library is
585fully re-entrant (no writable globals).  Making them fully re-entrant would
586make Ghostscript usable in multi-threaded environments, and more easily
587usable in embedded environments.  Note that this is necessary, but far from
588sufficient, for Ghostscript to allow simultaneous execution of a single
589Ghostscript interpreter instance by multiple threads: that is probably
590permanently out of the question.  <I>Almost all drivers, including all of
591the drivers in devs.mak which are maintained as part of the main Ghostscript
592code, are already fully re-entrant; making the remaining ones re-entrant
593should really be up to the driver author.</I>
594
595<h3>Ghostscript has no %ram% device.</h3>
596
597The %ram% device is documented in PS Supplement 3010 and 3011 dated August 30, 1999.
598This is probably not a major impediment to portability, but it would be handy.
599<p><I>
600On Unix, the suggested implementation would be to create a subdirectory
601of the temporary directory (usually /tmp), with the name chosen and the
602directory created in such a way as to avoid /tmp races and similar
603problems. Ghostscript should delete the subdirectory when it exits.
604</I>
605
606<!-- [2.0 end contents] ==================================================== -->
607
608<!-- [3.0 begin visible trailer] =========================================== -->
609<hr>
610
611<p>
612<small>Copyright &copy; 2000 Aladdin Enterprises.  All rights
613reserved.</small>
614
615<p>
616<small>This file is part of AFPL Ghostscript.  See the
617<a href="Public.htm">Aladdin Free Public License</a> (the "License") for
618full details of the terms of using, copying, modifying, and redistributing
619AFPL Ghostscript.</small>
620
621<p>
622<small>Ghostscript version 7.04, 31 January 2002
623
624<!-- [3.0 end visible trailer] ============================================= -->
625
626</body>
627</html>
628