Copyright (C) 1992 Aladdin Enterprises. All rights reserved. This file is part of Ghostscript. Ghostscript is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY. No author or distributor accepts responsibility to anyone for the consequences of using it or for whether it serves any particular purpose or works at all, unless he says so in writing. Refer to the Ghostscript General Public License for full details. Everyone is granted permission to copy, modify and redistribute Ghostscript, but only under the conditions described in the Ghostscript General Public License. A copy of this license is supposed to have been given to you along with Ghostscript so you can know your rights and responsibilities. It should be in a file named COPYING. Among other things, the copyright notice and this notice must be preserved on all copies. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This file, history.doc, describes the changes in very old releases of Ghostscript. For more recent changes, see the NEWS file. For an overview of Ghostscript and a list of the documentation files, see README. Version 2.3 (8/28/91) =========== This is a minor release to fix two bugs and add the PaintJet driver, which didn't make it into 2.2. Utilities --------- Changes the pstoppm utility so it counts pages correctly even in the presence of arbitrary saves and restores. Drivers ------- Adds a new, "supported" PaintJet driver. Changes the Epson driver to use ESC+D rather than ESC+\ for horizontal positioning, since many printers don't support the latter. Adds horizontal double-density (two-pass) printing to the Epson driver, so it can do 240 x 60 and 360 x 180 densities. (Vertical double density is not supported yet.) Version 2.2 (6/1/91) =========== The purpose of this release is to add save/restore, and a few miscellaneous Level 2 P*stScr*pt features such as undef. It also includes major improvements in graphics quality and in handling of high-resolution printers. Procedures ---------- Changes the version numbering to M.mpp rather than M.m.p, so that `version' can be a real number for those programs that insist on it. Renames ghost.ps as gs_init.ps, gfonts.ps as gs_fonts.ps, and statusd.ps as gs_statd.ps. The initialization files now all are named gs_*.ps. Renames gdevs.{c,h,tl} as gconfig.{c,h,tl}. Changes the relevant makefiles and command files so that a single build can contain several drivers that share code, e.g., the Epson driver and the DeskJet driver. Changes gs_init.ps so it relies on an external gconfig.ps file rather than making a specific test for the presence of Level 2 features. Adds an entry for uglyr.gsf to the makefile. Removes the distinction between CCA and CCNA, since most of the files now contain constructs that require non-ANSI compilation on MS-DOS platforms. Adds a `man' page for the ansi2knr utility. Changes the documentation (use.doc) to show how to use -sDEVICE=, or the selectdevice procedure, to select devices by name. Adds DEVICE_DEVS to the makefiles (analogous to DEVICES and DEVICE_OBJS). This finally makes the make procedure fully automatic. Adds the name of the initialization file (gs_init.ps) as a platform-specific makefile parameter, GS_INIT. Removes the test program gt.{c,tr} from the fileset, since it is not useful to users. Moves the Symbol encoding vector to a separate file (symbol_e.ps), from which it is loaded when first used. Changes the error handler so it can handle errors that occur while reading the initialization files. Extends ansi2knr so it can handle `void' and `...' in parameter lists. Adds quit.ps to the set of installed files. MS-DOS-specific changes - - - - - - - - - - - - Adds the VGA and BGI drivers to the standard MS-DOS configuration, and makes VGA the default. Adds a `+' and a newline at the end of gs.tr, to avoid problems with file transfer programs or editors that add a newline at the end of files. Changes the name of msdos.mak to turboc.mak, and creates a new tbcplus.mak makefile for use with Turbo C++ and Borland C++. Changes the extension of the loader response files from .tl to .tr. Changes the default search path from c:/ghost and c:/ghost/fonts to c:/gs and c:/gs/fonts. Changes the directory separator from `|' back to ';', since it appears that DOS can handle a ; in a command line if it is prefixed with \. Unix-specific changes - - - - - - - - - - - Changes the uses of install in unixtail.mak so they only install a single file at a time, which is all that the standard Unix install allows. Removes the duplicate files (README/readme, LICENSE/license, COPYING/copying, Fontmap/fontmap). Changes the ld flags from LDPLAT to LDFLAGS. Adds XCFLAGS and XLDFLAGS. These are concatenated with CFLAGS and LDFLAGS respectively. The intention is that they be set from the `make' command line if desired. VMS-specific changes - - - - - - - - - - Repairs the omission of ZPACKED from the VMS build lists. Drivers ------- Fixes bugs: - The SunView driver produced semi-garbage on little-endian platforms (Sun-386i) because it didn't swap the bit order. - The X driver would dump core if it couldn't open the display and the DISPLAY environment variable wasn't set. - The X driver relied on white = 0, black = ones in a couple of places; - The X driver would return an error, instead of clipping, if asked to display outside the window. - The X driver would create inappropriately sized windows, because it believed the server's report of the screen resolution. Adds Fran Taylor's Private Eye driver to gdevs.mak and the fileset (not supported by Aladdin Enterprises). Adds Neil Ostroff's TruFax driver to gdevs.mak and the fileset (not supported by Aladdin Enterprises). Makes the scratch file template for the printer drivers a per-platform quantity (gp_scratch_file_name_template). Puts the default scratch files for Unix in /usr/tmp rather than /tmp. Changes the SunView driver to prevent the Ghostscript window from being destroyed (which badly confuses the interpreter). Extends the Epson driver to handle a variety of print densities in both X and Y, to handle 24-pin as well as 8-pin graphics, and to allow optional specification of default density in the makefile (gdevs.mak). Refactors the printer drivers so that a single driver handles both DeskJet and LaserJet. Adds LaserJet drivers that use the new compression modes on the LJ IId/IIp and LJ III. Changes all the printer drivers to use band lists rather than bitmap paging as the buffering method. (The individual drivers need only a one-line change to replace mem_copy_scan_lines with gdev_prn_copy_scan_lines with a different argument.) Adds the halftone phase as additional arguments to tile_rectangle and tile_trapezoid. Adds an entirely new and much simpler PaintJet driver, using the new band list interface. Adds margin information to the device structure. This is currently only relevant for printer devices. Adds BGIPATH and BGIUSER environment variables, allowing additional control of the BGI driver. Changes the x/y_pixels_per_inch member of the device structure from int to float. Fonts ----- Patches gs_fonts.ps so definefont will add an isFixedPitch entry to FontInfo if there isn't one there. Removes the old "type 7 path" encoding code from gs_fonts.ps. Changes bdftops so it puts isFixedWidth and ItalicAngle entries in the FontInfo dictionary of the fonts it creates, since some P*stScr*pt programs rely on this. Changes bdftops so it synthesizes as many missing characters as possible out of the ones that are there (in particular: synthesizes accents out of punctuation marks, and accented characters using seac.) The results aren't all that good, but they're a lot better than having characters missing out of the font. Utilities --------- Adds a pfbtops utility for converting .PFB fonts to standard Ghostscript fonts. Fixes bugs: - ps2image didn't reset things properly between pages for multi-page documents. Interpreter ----------- Makes Ghostscript recognize `-' alone as meaning that it should read from standard input as though it were a file. This allows Ghostscript to accept a pipe as input. Fixes bugs: - seac in type1addpath used the current font's encoding, not StandardEncoding. - type1decryptfile (eexec) didn't recognize binary (as opposed to hex) representation. - Mentioning a name whose value was a no-access object caused an invalidaccess error. - There was a bogus definition of `run' in zfile.c. - The interpreter didn't handle end-of-file on stdin properly. - Real numbers with an 'e' or 'E' but no decimal point were not recognized. - On MS-DOS systems, inside strings, \ followed by a newline was not discarded properly. - On MS-DOS systems, the long unsigned divide routine sometimes gave incorrect answers. Among other things, this caused alternate-radix numbers sometimes to crash the interpreter. - cvrs didn't do the right thing about reals or negative integers. - .echo.mode was being reset with def instead of store, and was defined in systemdict rather than userdict. - setgray and settransfer didn't interact properly. - 16#80000000 was being interpreted as a signed integer (and converted to a real) rather than an unsigned one. - atan returned 0 sometimes when it should have returned 180. - currentcmykcolor was defined wrong. Removes the filename operator, since no standard Ghostscript code used it, and it caused problems with some P*stScr*pt files. Implements new operators: filenameforall, selectfont (as a procedure), stringmatch, undef. Adds new standard procedures: selectdevice. For MS-DOS, requires that the operand and execution stacks be located in the data segment, and uses short pointers to address them. This produces significantly smaller and faster code. (These changes are not visible to users or library clients.) Changes the assignment of attribute bits, and adds new bits for save/restore and the garbage collector. Changes many of the macros in store.h to support save/restore. (These changes are not visible to users or library clients.) Implements save and restore. Moves type names from gs_init.ps to ghost.h and ztype.c. Moves error names from gs_init.ps to errors.h and iinit.c. Introduces gp.h as a documented interface to the platform-specific files. Adds the -- switch, which allows Ghostscript programs to take arguments from the command line. Changes many uses of the name `name' to something else, to avoid upsetting the Microsoft C compiler. Really implements packed arrays -- they took the same amount of space as ordinary arrays in previous versions. Changes exitserver in serverdict so that it just clears the stacks. (This isn't the correct fix, but it will do as a workaround.) Makes many miscellaneous small changes to pacify various compilers. Changes gs_fonts.ps so that when "quiet" mode is selected (-q switch), Ghostscript doesn't print anything when loading fonts or when substituting for undefined characters. Defines the name consisting of just a control-D as a no-op, because some P*stScr*pt-generating applications put control-Ds in their output. Implements halftone phase (sethalftonephase and currenthalftonephase operators). Removes the -E switch, since it is no longer useful. Changes the -w and -h switches to a single -g (geometry) switch, with usage -gx. Makes the -h switch, and a new -? switch, print usage help. Implements correct handling of stack overflow errors (makes an array out of the contents of the overflowing stack, and resets the stack, before invoking the error handler). Adds t_oparray (`operators' defined as procedures) and the makeoperator operator. This is so that programs like the Distillery that rely on all operators being bound by `bind' will work properly. Adds a new NOPAUSE flag to suppress the prompt and pause at copypage and showpage. Library ------- Fixes bugs: - gs_type1_interpret didn't store the encryption state or the skip count before returning to let the client handle a seac or an endchar in the middle of a seac. - The definition of the Type 1 operator ce_testadd was based on wrong information; the operator takes only 2 operands and does something unknown. - mem_true24_copy_mono wasn't incrementing the destination pointer if the color was transparent, leading to garbled characters. - gx_lookup_fm_pair would sometimes look at one entry beyond the end of the cached font/matrix pair area. (This probably had no practical effect.) - gs_type1_interpret didn't save the current point when returning to the client for a callothersubr, causing some characters to be rendered displaced (such as some of the chess pieces in chess.ps). - gs_setgray, gs_sethsbcolor, gs_setrgbcolor, gs_setflat, and gs_setlinewidth gave errors for out-of-range operands rather than forcing them into range. - Transfer functions were not actually supported. - The area fill algorithm failed on certain complex paths. - The current point was sometimes defined when a BuildChar procedure was called. - Stroking a degenerate line didn't display anything for round caps or joins. - If the ends of a curve had exactly the same X coordinate, the curve sometimes wouldn't be displayed. - Very thin lines that went outside the clipping region would sometimes be displayed as dashed, or not at all. - The translation in a FontMatrix was ignored. - Very wide, shallow lines would color extraneous pixels when using bevel or miter joins. - Dashed lines didn't join properly at the beginning of a closed path. - 0-degree arcs didn't add the appropriate line (possibly degenerate) to the path. - gs_type1_interpret didn't reset the callsubr stack when starting the base character of a seac, which caused confusion if the accent's endchar fell inside a Subr. - Non-monochrome memory memory devices weren't checking the arguments of the drawing procedures properly. - The initial clipping rectangle for memory devices was being computed wrong. - Null devices had a semi-infinite clipping rectangle instead of an empty one. - gs_setlinewidth was treating negative arguments as zero, instead of taking the absolute value. - imagemask with a dithered color used a solid color rather than the dithered one. Tweaks the area fill and image rendering algorithms to be a little more liberal with paint when being used to render characters. Changes the name of the 8-bit mapped color memory device from mem_mapped_color_device to mem_mapped8_color_device. Changes the memory devices so that on little-endian platforms, they can store the bytes within a word in either order. (Little-endian order allows efficient 32-bit updating, big-endian is required when displaying or writing to a printer or a file.) Implements halftone phase. Replaces the trapezoid fill algorithm with a much more accurate one inspired by a contribution from Paul Haeberli. This also changes the graphics convention back to filling only pixels whose center falls within the region to be filled. Changes the character cache to allocate headers and bits contiguously out of a single ring buffer. Changes gs_imagemask and gs_imagemask_init to take a thickness adjustment parameter. Changes gs_setcachedevice and gs_setcharwidth to take the graphics state as a parameter. Renames gx_device_memory_bitmap_size as gdev_mem_bitmap_size, mem_copy_scan_lines as gdev_mem_copy_scan_lines, and mem_bytes_per_scan_line as gdev_mem_bytes_per_scan_line. Version 2.1.1 (1/15/91) ============= This is a sub-release distributed to fix a few early bugs in 2.1, just in time for the new GNU master tape. Build procedures ---------------- Removes all of the (undebugged) Level 2 code from the fileset, as well as the (unused) file gdevvga.c. Changes the tar file so that the files are stored in the directory gs rather than simply gs, e.g., gs211. Interpreter ----------- Changes the scanner so that \ is recognized within strings regardless of whether the scanner is reading from a string or from a file. This is compatible with newer P*stScr*pt interpreters, and with the newer P*stSc*pt language specification, but not with the older specification in the original PostScript Language Reference Manual. Drivers ------- Fixes the max_value macro in gdevmem.c so that compilers won't complain about a left shift by 32. Adds 'byte' to the list of types that gdevx.c must sidestep because header files use them. Library ------- Changes the computation of penum->unpack in gsimage.c so as not to upset compilers that don't treat procedures and pointers to procedures as compatible types for conditional expressions. Version 2.1 (12/31/90) =========== This is primarily a bug fix release to clean up problems in 2.0. It also implements a first cut at the new color operators. Build procedures ---------------- Changes the separator for multiple directories in MS-DOS from ';' to '|', since there is no way to include a ';' in a command line. Adds /fonts to the default search path, where is c:/ghost for MS-DOS systems and `pwd` for Unix systems. Adds new documentation describing how to direct output to the printer. Changes the PROCTYPE and USE8087 options in MSDOS.MAK to CPU_TYPE and FPU_TYPE. The latter now indicates the type of FPU to generate code for, if any. Drivers ------- Adds a driver for the Canon BubbleJet BJ10e. Modifies the EGA driver to handle (non-standard) frame buffers larger than 64K. Adds drivers for the VGA and for the EIZO MDB-10 (a 1024 x 768 frame buffer). Changes the X driver so that it clips to the window dimensions, rather than reporting an error. Notes that the H-P LaserJet driver, like the DeskJet driver, works under Unix as well as MS-DOS. Adds support for 120 X DPI mode, and for the LQ-1500, to the Epson driver. Fonts ----- Fixes bugs in bdftops: - It was using /UniqueId instead of /UniqueID as the key for the font unique ID. This effectively disabled the font cache. - The definition for .notdef was bogus -- an invalid CharString. Changes ghost.ps and gfonts.ps so that NullFont is the initial font, rather than Ugly. Arranges things so that when attempting a font substitution, if the default font is not found, NullFont is used instead. Extends bdftops so that if certain easily synthesized characters are missing from a font, it will attempt to synthesize them using available characters. Interpreter ----------- Extends the -T switch to allow specifying a printf template for the arguments of the procedure being traced. Fixes bugs: - /0 was interpreted as equivalent to 0 (a number) rather than a literal name. - packedarray was defined as being like array, instead of like array followed by astore. - Many minor and harmless type mismatches (and a couple of very minor genuine bugs) were upsetting the Apollo C compiler. - exp was incorrectly failing in certain cases with a negative first argument. - copyscanlines incorrectly required at least 4 elements on the operand stack, although it correctly only used the top 3. - readhexstring incorrectly read 1 byte even if the string length was zero. - Not every place that expected an array would accept a packed array. - Very complex paths (and infrequently other things) could produce a 'memory leak'. - / alone would skip following whitespace and gather following characters, rather than creating an empty name. - ghost.ps left newerror defined as true in $error, which resulted in an erroneous error report if a program executed a 'stop'. - The definition of exitserver in serverdict didn't clear the stack. - currentfile returned an executable file, rather than a literal one. - setfont for Type 1 fonts didn't check the UniqueID in the font dictionary against the one in the font's Private dictionary. - A value stored in a dictionary under the key /xxx couldn't be retrieved using the key (xxx), and vice versa. - charpath with a Type 1 font on a string containing a 'space' would produce garbage (it released the parent path inappropriately). - bytesavailable did not work properly for terminal input. Changes the interface to the memory allocator so that it always takes an element size and an element count, like calloc instead of malloc (but note that alloc does *not* clear just-allocated blocks). Gets rid of the special 'dynamic' allocation procedures. Changes the random number operators to use a better implementation. Changes the idiv operator so it will accept any numbers, not just integers, as arguments. (The PostScript manual doesn't allow this, but implementations apparently do.) Provides semi-fake but usable definitions for all of the color PostScript extensions, including a real implementation of colorimage. No longer uses the name 'null', which is apparently reserved by Microsoft C. Makes a number of other minor changes required to pacify the Microsoft C compiler. Implements %statementedit and %lineedit. (%statementedit is equivalent to %lineedit, which is wrong.) Changes the interactive interpreter to use %statementedit. Changes the scanner to accept null, ctrl-K (vertical tab), and ctrl-L (form feed) as whitespace. Ctrl-L terminates a comment, null and ctrl-K do not. Allows a literal string as the 'proc' argument(s) for image, imagemask, and colorimage. Adds the following operators/procedures: arct, cleardictstack, deletefile, renamefile. Defines =print as a synonym for =, for the benefit of LaserPrep. Implements non-zero PaintType for the show operators (but not for charpath) for Type 1 fonts. Adds the ISOLatin1Encoding encoding vector. Renames currentcolor and setcolor as currentgscolor and setgscolor, to avoid conflict with the Level 2 PostScript names. Removes colorhsb, colorrgb, hsbcolor, and rgbcolor. Library ------- Fixes bugs: - In a couple of places, a 0 was being passed as a pointer argument without casting, which confused the Microsoft C compiler. - Image devices were not recognized properly in debugging configurations. - Inverted-color monochrome image devices were not recognized properly. - Images that exactly fill the drawing area rendered very slowly, because they erroneously used the general clipping algorithm. - Images that are 1-for-1 with the device were incorrectly scaled by a factor of 8 in X. - Rounding artifacts sometimes caused characters to be unevenly offset vertically by 1 pixel. - Type 1 fonts that used the Flex feature resulted in garbled images. - The show operator routines would incorrectly fill or stroke a path that existed at the time the show was started. - setscreen truncated the cell size instead of rounding, which could produce off-by-1 anomalies. - stroke would sometimes produce garbage (or nothing at all) for very narrow lines. - path filling would only color the pixels whose centers fell inside the path: the Adobe specification requires coloring a pixel if any part of it falls inside the path. Changes the Epson printer driver so that it drives the printer directly rather than writing to a file. Changes pathbbox so that if the path is empty but there is a current point, it returns a null rectangle at the current point. Changes gs_image_init to take an additional parameter (after bps) giving the number of samples per pixel (1, 3, or 4), and an indication of whether the samples for each pixel are together or separated (-3 or -4). Renames the gs_image_data and gs_imagemask_data procedures as gs_image and gs_imagemask, and removes the old versions of the latter. Adds gs_colorimage. Replaces Snoopy's color dithering algorithm with one contributed by Paul Haeberli. Changes gs_setgray, gs_[set]hsbcolor, and gs_[set]rgbcolor so that they coerce arguments outside the range [0..1] back into the range, instead of signalling an error. Makes a number of minor changes required to pacify the Microsoft C compiler. Changes gs_arcto so that if the last argument is a null pointer, the tangent points are not returned. Removes gs_type1addpath, which is not useful. (Clients must call gs_type1_init and gs_type1_interpret directly.) Implements the 'seac' opcode for Type 1 fonts, allowing fonts with accented characters to display properly. Implements the undocumented 'testadd' opcode for Type 1 fonts, which is used by some Adobe fonts. Renames gs_currentcolor and gs_setcolor as gs_currentgscolor and gs_setgscolor. Removes gs_colorhsb, gs_colorrgb, gs_hsbcolor, and gs_rgbcolor. Version 2.0 (9/12/90) =========== The main purpose of this release is to add fonts, support for multiple devices, and imaging into memory. It also fixes a number of miscellaneous bugs. (Unfortunately, accurate records of the bugs fixed are not available.) The changes were so extensive that we chose to increment the major version number. Miscellaneous ------------- Doesn't attempt to open the .MAP file on Unix systems. Adds mention of statusd.ps to interp.doc. Notes that Turbo C 2.0, not 1.5, is required for building the MS-DOS version. Adds a DEVICES= line to the makefile, and allows multiple devices. Documents, in interp.doc, the X Windows resources that Ghostscript recognizes. Adds three PostScript masters to the fileset: chess.ps (+ cheq.ps), golfer.ps, and escher.ps. Drivers ------- Changes the names of all the device drivers. See gdevs.mak for the updated list. Adds a (working) driver for SunView. Adds drivers for the Sony NeWS frame buffer, and the Sony Microsystems NWP533 printers. These drivers were contributed by users, so we aren't prepared to answer questions about them. Adds a driver for the Borland Graphics Interface (BGI) for MS-DOS systems. Note that to use this driver with a non-EGA/VGA display, you need a .BGI file appropriate for your hardware. (The Ghostscript executable includes the EGA/VGA driver.) Adds a driver for Epson printers. The driver has only been tested on an LX-800, and on an H-P DeskJet in FX-80 emulation mode, but may work on other models. The driver could be adapted to work on Unix systems, but as distributed, it only works on MS-DOS systems. Adds a driver for the Hewlett-Packard DeskJet printer. The driver could be adapted to work on Unix systems, but as distributed, it only works on MS-DOS systems. The X Windows driver no longer waits for the user to type a character before bringing up the initial display. Adds information to drivers.doc describing how to change the definition of the device structure and procedure table. Extends the tile_rectangle and tile_trapezoid driver procedures to interpret color0 = color1 = gx_no_color_index as meaning that the tile is actually colored, not a mask. Build procedures ---------------- Changes the tar file so it puts everything in a directory called gs. Removes the -ansi switch for gcc (this was causing problems with on some systems). Changes LDPLAT to the string -X, which is appropriate for most Unix systems (but not for SunOS 4.n). Adds EXTRALIBS to the makefile, for specifying additional libraries to be linked in. Adds a 'clean' target for 'make', to get rid of all temporary files, the binaries, and the executable. Changes names of system-specific files from gp-xxx.c to gp_xxx.c. Adds support for VMS (gp_vms.c and ghost.dcl). Creates a new file gdevs.mak, and reorganizes the other makefiles, so that the choice of which device driver(s) to include is isolated in a single line in the platform-specific makefile. Changes the standard MS-DOS makefile so it builds for 8088/86 (not 80386), with neither -DNOPRIVATE nor -DDEBUG. Changes the name of the MS-DOS makefile from dos-ega.mak to msdos.mak, and the Unix makefiles from ux-[g]cc-x.mak to unix-[g]cc.mak. Updates drivers.doc to describe how to add new drivers in gdevs.mak. Removes gdevs.ps: the drivers are now responsible for specifying the size of the imaging region. Interpreter ----------- Adds a makefile macro GS_LIB_DEFAULT and an environment variable GS_LIB to define a search path for the library (initialization and font) files, and implements the -I switch for the same purpose (replacing -sLIB=, which was never actually implemented). See interp.doc for details. No longer clears the operand stack between interactive inputs. No longer prints the contents of the operand stack after every input in debug mode. Doesn't "eat" the character that the user types to proceed after a showpage, unless it's an isolated . Changes the prompt so that it says GS> if the operand stack is empty, or GS if there are n > 0 elements on the operand stack. Adds -w and -h switches to the command line, equivalent to -dWIDTH= and -dHEIGHT= except that they require numeric arguments. Adds -q (quiet startup) switch to the command line, which suppresses some initial messages and also has an effect equivalent to -dQUIET. Fixes bugs: - = and == caused an error on some kinds of objects if the object didn't have read access. - cvs didn't print operator names. - The definition of dynamic_begin in iscan.c caused the DEC VMS C compiler to produce incorrect code. - mul didn't return a correct (real) result when multiplying a very large integer by an integer that wasn't very large. - eq and ne didn't work on files, fonts, save objects, and some operators. - The scanner would sometimes blow up on floating point numbers beginning with a '.'. - flushfile didn't pop its argument from the stack. - put and putinterval would store into a packed array. - a few operators didn't check properly for stack underflow. - cvrs produced wrong output for radix values greater than 10. - The scanner would convert upper-case letters in alternate-radix numbers wrong on Unix systems. - String comparisons other than equality often produced the wrong result if the strings were of different lengths. - An ifelse as the last thing inside a forall would confuse the execution stack. - There were some omitted casts and 'private' declarations that made the GNU compiler unhappy. - There was a memory leak in the image[mask] operators that caused 516 bytes to be permanently lost each time one of them was used. - Quoted strings of length greater than 50 and less than 100 would get mangled when being read in. - The scanner didn't consume the whitespace character following a token, so programs that read data out of the program file could get confused. - Under rare circumstances, an object of size between 249 and 255 bytes could get allocated on top of another object. Allows bind to bind packed arrays, even though they aren't normally writable. Changes the length operator to allow a name as the argument. (The PostScript manual doesn't allow this, but implementations apparently do.) Changes the setcachedevice operator to allow the bounding box to be specified as a 4-element array instead of 4 scalars. (The PostScript manual doesn't allow this, but implementations apparently do.) Removes a line from ghost.ps that accidentally disabled the font cache. Implements memory devices (makeimagedevice, copyscanlines, and makedevice for image devices). makeimagedevice is implemented only for 1, 8, 24, and 32 bits per pixel. Changes the deviceparams operator so it pushes a mark on the stack below the parameters. This is to allow for devices that have more than the standard set of parameters. Replaces defaultdevicename with two new operators, getdevice and devicename. Adds a flushpage operator that flushes any outstanding buffered output to the screen. This is not the same as copypage: on printers, copypage actually prints a page, whereas flushpage may do nothing; on displays, flushpage and copypage may both flush output to a server. Adds an unread operator for pushing back a character into a file. Adds a description of proposed grayimage and colorimage operators to ghost.doc, even though they aren't implemented yet. Changes the name of the currentfileposition operator to fileposition. Removes the framedevice operator, since the new device operators supersede it. Adds a writeppmfile operator, for writing the contents of a memory device to a ppm file. Makes Ghostscript work even when the >> operator doesn't sign-extend negative numbers. (This has not been tested.) Adds the Symbol encoding to ghost.ps. Adds two new file-related operators, filename and findlibfile. See ghost.doc and interp.doc for details. Adds type1encrypt and type1decrypt operators for manipulating Adobe Type 1 encoded fonts. Changes the imagecharpath and addcharpath operators to type1imagepath and type1addpath. These operators now work with the Adobe Type 1 font encoding. Adds the type1decryptfile operator for reading Adobe Type 1 encrypted fonts. Library ------- Fixes bugs: - curveto and lineto didn't check for the current point being defined. - stringwidth would fail if there was no current point. - There were omitted casts that made the GNU compiler unhappy. - Line caps and joins didn't always work. - Dashed lines didn't work at all. - If you read out the current matrix while inside a BuildChar procedure, the result was garbage. - image[mask] would crash if you gave it a single string with more than 64K-1 pixels (MS-DOS only). - Filling with a gray pattern sometimes wrote into pixels beyond the right edge of the region (MS-DOS only). - The font cache would mistake fonts for each other if both fonts had a default (unsupplied) "unique ID". - When a character was entered into the font cache for the first time, sometimes it would display as garbage and/or displaced vertically from its proper position. Implements gs_makeimagedevice, gs_copyscanlines, gs_getdevice, gs_devicename, gs_flushpage, gs_writeppmfile, gs_type1encrypt, gs_type1decrypt, gs_type1imagepath, and gs_type1addpath procedures corresponding to the new operators in the interpreter (see preceding section). Changes [gs_]setdevice so that it does an erasepage when it first opens the device. Changes definition of gx_device structure as follows. NOTE: THIS AFFECTS ALL DRIVERS. - Removes bits_from_MSB (which wasn't actually used, in any case). Ghostscript now assumes officially, as it always did in practice, that device bitmaps are stored MSB first, i.e., X=0 corresponds to the 0x80 bit in the first byte. - Removes the initial_matrix member, which wasn't actually being set up. - Adds a new member 'name', a string giving the device name. - Adds new members 'x_pixels_per_inch' and 'y_pixels_per_inch'. These are only used by the default initial_matrix procedure (see below). - Adds a new procedure 'output_page'. The default implementation (gx_default_output_page) just calls the sync_output procedure. - Adds a new procedure 'get_initial_matrix'. The default procedure uses the width, height, and x/y_pixels_per_inch members to compute the matrix, assuming that X values run from right to left, and Y values run from top to bottom. Changes the names of the allocation procedure types gs_proc_alloc and gs_proc_free to proc_alloc_t and proc_free_t, and moves them from gs.h to std.h. Makes Ghostscript work even when the >> operator doesn't sign-extend negative numbers. (This has not been tested.) Version 1.3 (6/20/89) =========== This release should have had a lot more things in it, but time pressure and the already long delay in getting it out made it necessary to push it out the door in an incomplete state (e.g., no testing on X systems whatsoever). Interpreter ----------- Makes -d and -D equivalent on the command line. Adds a new switch -s / -S that defines a name as a string rather than a token. Arranges things so that if -sLIB=_a_prefix_ is defined on the command line, (filename) run will look for _a_prefix_filename before giving up if filename isn't the name of an accessible file. Changes showpage from an operator to a procedure. The definition of showpage in ghost.ps does a copypage, beeps the console, waits for the user to type a character (normally a , since line buffering is always enabled), and then does an erasepage and an initgraphics. Adds a new initialization file, gdevs.ps, containing device-dependent parameters. The default window size for X Windows is properly set to 612 x 792, i.e., 8.5" x 11". Adds a new optional initialization file, statusd.ps, that provides dummy definitions for the names found in statusdict on LaserWriters. Adds a new operator, getenv, to get information from the shell environment. Adds a new predefined operator, defaultdevicename, that returns either (X) or (EGA) according to how the interpreter was built. Adds a new type, devicetype, and new operators deviceparams, getscanlines, makedevice, makeimagedevice, and setdevice. Changes currentdevice to return a device object rather than a set of parameters. Makes the scanner recognize reals with 'e' exponent notation, and handle reals with more than 9 digits. Fixes a bug that made names starting with digits read incorrectly. Fixes a bug in the exp operator that made it not pop its first argument from the stack. Fixes a bug in the rand operator that made it return negative values about half the time. Fixes a bug in equality comparison (eq, ne, and several other operators) that made unequal operator objects occasionally appear to be equal on DOS systems. Fixes a bug in the bind operator that made it not work on packed arrays. Changes the internal representation of dictionaries so they can be expanded or contracted dynamically. Adds a new operator, setmaxlength, to change the allocated size of a dictionary. Changes sstorei.h so that non-DOS compilers don't encounter the #pragma directive used by Turbo C. Restores the display mode (on MS-DOS systems) when exiting. Fonts ----- Makes undefined characters in the standard font display as tilde rather than blank (or causing an error). Unmapped character codes (those mapped to .notdef in the encoding) still display as nothing, per the PostScript manual. Library ------- Adds a new header file, gxbitmap.h, with some new documentation describing the internal storage format for bitmaps. Makes numerous internal changes in the character / font cache, affecting many of the routines in gxcache.c. Fixes a bug in gz_draw_line / gz_fill_trapezoid that made nearly horizontal lines display wrong. Fixes a bug in gs_scale that made scaling not work if the coordinate system was rotated or skewed. Extends the font cache so it will handle characters rotated by multiples of 90 degrees. Changes the second argument of gx_path_bbox and gx_path_is_rectangle to be a gs_fixed_rect * rather than a fixed [4]. Changes gs_matrix_rotate so it handles multiples of 90 degrees as a special case. Changes the definition of the gx_device structure to accommodate the new device operators, and adds corresponding library calls. Changes the type for a device color index from int to gx_color_index (equivalent to unsigned long). ***NOTE***: this affects existing clients and drivers in a non-trivial way on MS-DOS systems. Changes gs_malloc and gs_free to take a client name string as an argument. Usage procedures ---------------- Changes the compilation rules for Unix systems to not use the -o and -c compiler flags together, to be compatible with more versions of cc. Changes the gcc makefile to use $(GCC) rather than gcc as the compiler name. Moves the -1 flag for the MS-DOS compiler from the cc*.bat files to the makefile. Changes CCDEBUG to CCFLAGS, and adds ASMFLAGS, in DOS makefile. Adds -DFOR80386 and /DFOR80386 to enable use of 80386 instructions in assembly code on DOS systems. Merges the DEBUG and gs_DEBUG switches. There is now only a single DEBUG switch that affects both the interpreter and the library. Adds a new compilation switch, -DNOPRIVATE, that makes private (static) variables and procedures public for debugging and profiling (only needed on DOS systems). Adds the DOS executable (gs.exe and gs.map) to the distribution fileset. Adds new platform-specific code files, gp-*.c, for a few things like reading the clock. Adds a new documentation file, drivers.doc, that describes the interface between Ghostscript and device drivers. Version 1.2 (2/22/89) =========== Interpreter ----------- Adds the new facilities in version 25 of PostScript: //name for immediate lookup, packed arrays (setpacking, currentpacking, packedarray operators), and new font cache parameters (setcacheparams, currentcacheparams operators). Adds new operators (setfileposition, currentfileposition) for random access to files. Extends readhexstring to take either a string or a file, just like token. Fixes a bug that caused the 'for' operator (and a couple of others) to randomly smash memory locations on PC platforms. Library ------- Renames the init_device driver procedure as open_device, and adds a corresponding close_device. Adds new procedures to read and set the cache limit values (implementing the currentcacheparams and setcacheparams operators). Usage procedures ---------------- Changes the name of the Unix makefile to ux-cc-x.mak, and adds a new Unix makefile, ux-gcc-x.mak, for using gcc instead of cc. (The latter doesn't actually work yet.) Changes the name of the single built-in font from uglyfont.cp to ugly10.cp. Version 1.1 (2/12/89) =========== Interpreter ----------- Makes the scanner treat ^Z (ASCII code 26) as whitespace: it erroneously treated ^R (ASCII code 22, or octal 26) as whitespace. Makes the token and readline operators, and the syntax for comments, recognize \r (code 13), \n (code 10), and \r\n as equivalent end-of-line indicators. The token and readline operators will skip over any of these sequences at the end of a token or line respectively, and a comment will read through any of these sequences. The other file operators (read, write, readstring, writestring) do nothing special with these characters. Changes the debug switch name from -D to -Z. Adds a -D switch for defining names in systemdict from the command line. Defines -DDEBUG for printing out debugging information during initialization, and -DNODISPLAY for suppressing display output. Corrects a bug that prevented the error machinery from working -- in version 1.0, errors always dumped the stacks and aborted interpretation. Corrects a bug that made eq and ne not work for strings. Makes the atan (arctangent) operator normalize its results according to the PostScript convention. Makes the div operator check for zero divisor. Makes unimplemented operators (resetfile, echo, save, restore, strokepath, reversepath) truly undefined. Makes the interactive loop exit gracefully on end-of-file: in version 1.0 this caused an infinite loop. Implements the status operator. Corrects a bug that made the 'for' operator deliver garbage values if one or more of the operands (start, increment, end) was a real. Corrects a bug that made the arc and arcn operators not pop their operands from the stack. Corrects a bug that made the kshow operator crash the interpreter. Corrects a bug that made the print operator fail on machines that don't pass structure arguments by simply pushing the contents of the structure. Adds a new operator, imagecharpath, to convert images to addcharpath-compatible outlines. Changes alloc and alloc_free to use char * rather than byte *, and alloc_free to return void rather than int, making them compatible with the library's expectations and with malloc/free. Explicitly casts all expressions of the form (ptr1 - ptr2) used as procedure arguments to unsigned, to handle an incompatibility between Turbo C versions 1.5 and 2.0. Changes some of the internal conventions for operators: operators that push on the operand stack must check for overflow explicitly, and operators that modify the execution stack must return a special code. (See oper.h for details.) Initialization (ghost.ps, gfonts.ps) -------------- Modifies ghost.ps and gfonts.ps so they print debugging information only if the name DEBUG is defined. (Presumably the user will set this from the command line with -DDEBUG.) Changes ghost.ps so it initializes the nominal screen size to 640 x 350 on MS-DOS systems as before, but to 612 x 792 on Unix systems, which is an 8.5" x 11" page at 72 pixels per inch. Library ------- Corrects a bug that made the fill and eofill operators (gs_fill and gs_eofill) not perform a newpath afterward. Corrects the bug that made thin, nearly horizontal lines display wrong (as a series of disconnected dots) in the MS-DOS implementation. Fixes a bug in the EGA driver that often made it fill rectangular regions with black around information being displayed in white. Completely changes the internal representation of outline fonts, and changes btoi.ps (a Ghostscript language program for converting bitmaps to outlines) to use a new library call, gs_imagecharpath. Changes the extension for outline font files from .gf to .cp. Adds a new debugging switch, q, that traces all rectangle fill operations. Adds a new debugging switch, v, that traces all device-level output calls. Explicitly casts pointer differences passed as procedure arguments, as in the interpreter. Makes stringwidth work if there is no current point. In version 1.0, this gave a nocurrentpoint error. Usage procedures ---------------- Changes the name of the 'read me' file from READ.ME to README. Removes a bogus line (invoking the 'mcopy' utility) from the makefile. Splits up the makefile into a generic part (ghost.mak) and platform-specific parts (dos-ega.mak, unix-x11.mak). The latter are what is actually executed. Puts the definitions of the DEBUG and gs_DEBUG compilation flags into the makefile instead of in ghost.h and gx.h respectively. Changes the names of the documentation files to be a little less cryptic. Changes all the file names to lower-case in the documentation. Adds installation information to make.doc. Changes all function definitions (but not prototype declarations) to ANSI syntax, and adds a preprocessing step (ansi2knr) to convert them to K&R syntax on Unix systems. Changes the normal MS-DOS link configuration to not assume the presence of an 80x87 coprocessor, and describes how to increase performance if a coprocessor is present. Changes the names of all the interpreter .c files, except stream.c, to begin with 'i'. Version 1.0 (8/11/88) =========== First version released to the public.