home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
gnu
/
gs-2.6.1.4-src.lha
/
src
/
diffs
/
ghostscript-2.6.1.diffs
Wrap
Text File
|
1994-02-22
|
236KB
|
8,521 lines
diff -rc --new-file ghostscript-2.6.1-fsf/NEWS ghostscript-2.6.1-amiga/NEWS
*** ghostscript-2.6.1-fsf/NEWS Sat May 29 07:40:14 1993
--- ghostscript-2.6.1-amiga/NEWS Tue Feb 22 13:48:22 1994
***************
*** 1062,1068 ****
For Unix systems, changes the directories in GS_LIB_DEFAULT from
`pwd` to $(gsdatadir), i.e., normally $(datadir)/ghostscript, where
! datadir is normally /usr/local/lib.
Adds a note in the header file to the effect that the X Windows
driver expects to find header files in $(XINCLUDE)/X11, not in
--- 1062,1068 ----
For Unix systems, changes the directories in GS_LIB_DEFAULT from
`pwd` to $(gsdatadir), i.e., normally $(datadir)/ghostscript, where
! datadir is normally /gnu/lib.
Adds a note in the header file to the effect that the X Windows
driver expects to find header files in $(XINCLUDE)/X11, not in
diff -rc --new-file ghostscript-2.6.1-fsf/amiga-gcc.mak ghostscript-2.6.1-amiga/amiga-gcc.mak
*** ghostscript-2.6.1-fsf/amiga-gcc.mak Thu Jan 1 00:00:00 1970
--- ghostscript-2.6.1-amiga/amiga-gcc.mak Tue Feb 22 14:57:45 1994
***************
*** 0 ****
--- 1,2010 ----
+ # Copyright (C) 1989, 1992, 1993 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.
+
+ # makefile for Ghostscript, Unix/gcc/X11 configuration.
+ # Note: this makefile assumes you are using gcc in ANSI mode.
+
+ # ------------------------------- Options ------------------------------- #
+
+ ####### The following are the only parts of the file you should need to edit.
+
+ # ------ Generic options ------ #
+
+ # Define the installation commands and target directories for
+ # executables and files. Only relevant to `make install'.
+
+ INSTALL = install -c
+ INSTALL_PROGRAM = $(INSTALL) -m 775
+ INSTALL_DATA = $(INSTALL) -m 664
+
+ prefix = /gnu
+ exec_prefix = $(prefix)
+ bindir = $(exec_prefix)/bin
+ datadir = $(prefix)/lib
+ gsdatadir = $(datadir)/ghostscript
+
+ # Define the default directory/ies for the runtime
+ # initialization and font files. Separate multiple directories with a ','.
+
+ GS_LIB_DEFAULT=$(gsdatadir),$(gsdatadir)/fonts
+
+ # Define the name of the Ghostscript initialization file.
+ # (There is no reason to change this.)
+
+ GS_INIT=gs_init.ps
+
+ # Choose generic configuration options.
+
+ # -DDEBUG
+ # includes debugging features (-Z switch) in the code.
+ # Code runs substantially slower even if no debugging switches
+ # are set.
+ # -DNOPRIVATE
+ # makes private (static) procedures and variables public,
+ # so they are visible to the debugger and profiler.
+ # No execution time or space penalty.
+
+ GENOPT=
+
+ # Define the name of the executable file.
+
+ GS=gs
+
+ # ------ Platform-specific options ------ #
+
+ # Define the name of the C compiler.
+
+ CC=gcc
+
+ # Define the other compilation flags.
+ # Add -DBSD4_2 for 4.2bsd systems.
+ # Add -DUSG (GNU convention) or -DSYSV for System V or DG/UX.
+ # Add -DSYSV -D__SVR3 for SCO ODT, ISC Unix 2.2 or before,
+ # or any System III Unix, or System V release 3-or-older Unix.
+ # Add -DSVR4 (not -DSYSV) for System V release 4.
+ # XCFLAGS can be set from the command line.
+ # We don't include -ansi, because this gets in the way of the platform-
+ # specific stuff that <math.h> typically needs; nevertheless, we expect
+ # gcc to accept ANSI-style function prototypes and function definitions.
+
+ #FPU_FLAG =-Dm68881
+ #CPU_FLAG =-Dm68030
+ XCFLAGS = -O6 $(FPU_FLAG) $(CPU_FLAG)
+ CFLAGS=-DUSG $(XCFLAGS)
+
+ # Define platform flags for ld.
+ # SunOS and some others want -X; Ultrix wants -x.
+ # SunOS 4.n may need -Bstatic.
+ # XLDFLAGS can be set from the command line.
+
+ LDFLAGS=$(XLDFLAGS)
+
+ # Define any extra libraries to link into the executable.
+ # ISC Unix 2.2 wants -linet.
+ # SCO Unix needs -lsocket if you aren't including the X11 driver.
+ # (Libraries required by individual drivers are handled automatically.)
+
+ EXTRALIBS=
+
+ # Define the include switch(es) for the X11 header files.
+ # This can be null if handled in some other way (e.g., the files are
+ # in /gnu/include, or the directory is supplied by an environment variable).
+ # Note that x_.h expects to find the header files in $(XINCLUDE)/X11,
+ # not in $(XINCLUDE).
+
+ #XINCLUDE=-I/gnu/X/include
+
+ # Define the directory/ies for the X11 library files.
+ # This can be null if these files are in the default linker search path.
+
+ #XLIBDIRS=-L/gnu/X/lib
+
+ # ------ Devices and features ------ #
+
+ # Choose the language feature(s) to include. See gs.mak for details.
+
+ FEATURE_DEVS=filter.dev dps.dev level2.dev
+
+ # Choose the device(s) to include. See devs.mak for details.
+
+ DEVICE_DEVS=amiga_.dev amiga.dev amiga_low.dev amiga_high.dev amiga_super.dev
+ DEVICE_DEVS1=amiga_a2024.dev amiga_picassoii.dev amiga_printer.dev
+ DEVICE_DEVS2=amiga_ilbm.dev amiga_custom.dev
+
+ # ---------------------------- End of options --------------------------- #
+
+ # Define the name of the makefile -- used in dependencies.
+
+ MAKEFILE=amiga-gcc.mak
+
+ # Define the ANSI-to-K&R dependency. (gcc accepts ANSI syntax.)
+
+ AK=
+
+ # Define the compilation rules and flags.
+
+ CCC=$(CC) $(CCFLAGS) -c
+
+ # --------------------------- Generic makefile ---------------------------- #
+
+ # The remainder of the makefile (unixhead.mak, gs.mak, devs.mak, unixtail.mak)
+ # is generic. tar_cat concatenates all these together.
+ # Copyright (C) 1990, 1991, 1993 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.
+
+ # Partial makefile for Ghostscript, common to all Unix configurations.
+
+ # This part of the makefile gets inserted after the compiler-specific part
+ # (xxx-head.mak) and before gs.mak and devs.mak.
+
+ # ----------------------------- Generic stuff ----------------------------- #
+
+ # Define the platform name. For a "stock" System V platform,
+ # use sysv_ instead of unix_.
+
+ PLATFORM=amiga
+
+ # Define the extensions for the object and executable files.
+
+ OBJ=o
+ XE=
+
+ # Define the current directory prefix, shell quote string, and shell names.
+
+ EXP=
+ QQ=\"
+ SHELL=/bin/sh
+ SH=$(SHELL)
+ SHP=$(SH) $(EXP)
+
+ # Define the compilation rules and flags.
+
+ CCFLAGS=$(GENOPT) $(CFLAGS)
+
+ .c.o: $(AK)
+ $(CCC) $*.c
+
+ CCCF=$(CCC)
+ CCD=$(CCC)
+ CCINT=$(CCC)
+ # Copyright (C) 1989, 1992, 1993 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.
+
+ # Generic makefile for Ghostscript.
+ # The platform-specific makefiles `include' this file.
+ # They define the following symbols:
+ # GS - the name of the executable (without the extension, if any).
+ # GS_LIB_DEFAULT - the default directory/ies for searching for the
+ # initialization and font files at run time.
+ # DEVICE_DEVS - the devices to include in the executable.
+ # See devs.mak for details.
+ # DEVICE_DEVS1...DEVICE_DEVS9 - additional devices, if the definition of
+ # DEVICE_DEVS doesn't fit on one line.
+ # See devs.mak for details.
+ # FEATURE_DEVS - the optional features to include in the
+ # executable. Current features are:
+ # dps - (partial) support for Display PostScript extensions:
+ # see language.doc for details.
+ # level2 - (partial) support for PostScript Level 2
+ # extensions: see language.doc for details.
+ # compfont - support for composite (type 0) fonts.
+ # *** NOT IMPLEMENTED YET. ***
+ # filter - support for Level 2 filters (other than eexec,
+ # ASCIIHexEncode/Decode, NullEncode, PFBDecode,
+ # and SubFileDecode, which are always included).
+ # ccfonts - precompile fonts into C, and link them
+ # with the executable. In the standard makefiles,
+ # this is only implemented for a very few fonts:
+ # see fonts.doc for details.
+ # It is very unlikely that anyone would want to edit the remaining
+ # symbols, but we describe them here for completeness:
+ # GS_INIT - the name of the initialization file for Ghostscript,
+ # normally gs_init.ps.
+ # PLATFORM - a "device" name for the platform, so that platforms can
+ # add various kinds of resources like devices and features.
+ # QQ - a " preceded by whatever escape characters are needed to
+ # persuade the shell to pass a " to a program (" on MS-DOS,
+ # \" on Unix).
+ # XE - the extension for executable files (e.g., null or .exe).
+ # OBJ - the extension for relocatable object files (e.g., o or obj).
+ # BEGINFILES - the list of files that `make begin' should delete.
+ # CCBEGIN - the compilation command for `make begin', normally
+ # $(CCC) *.c.
+ # CCC - the C invocation for normal compilation.
+ # CCD - the C invocation for files that store into frame buffers or
+ # device registers. Needed because some optimizing compilers
+ # will eliminate necessary stores.
+ # CCCF - the C invocation for compiled fonts and other large,
+ # self-contained data modules. Needed because MS-DOS
+ # requires using the 'huge' memory model for these.
+ # CCINT - the C invocation for compiling the main interpreter module,
+ # normally the same as CCC: this is needed because the
+ # Borland compiler generates *worse* code for this module
+ # (but only this module) when optimization (-O) is turned on.
+ # AK - if source files must be converted from ANSI to K&R syntax,
+ # this is ansi2knr$(XE); if not, it is null.
+ # If a particular platform requires other utility programs
+ # to be built, AK must include them too.
+ # SHP - the prefix for invoking a shell script in the current directory
+ # (null for MS-DOS, $(SH) ./ for Unix).
+ # EXPP, EXP - the prefix for invoking an executable program in the
+ # current directory (null for MS-DOS, ./ for Unix).
+ # SH - the shell for scripts (null on MS-DOS, sh on Unix).
+ # The platform-specific makefiles must also include rules for creating
+ # ansi2knr$(XE), genarch$(XE), and genconf$(XE) from the corresponding
+ # .c files -- this is needed because Turbo C and Unix C treat the -o
+ # switch slightly differently (Turbo C requires no following space,
+ # Unix C requires a following space), and I haven't found a way to capture
+ # the difference in a macro.
+
+ all default: $(GS)$(XE)
+
+ distclean realclean: clean
+ rm -f makefile
+
+ clean mostlyclean:
+ rm -f *.$(OBJ) *.a core gmon.out
+ rm -f *.dev *.d_* arch.h gconfig*.h o*.tr l*.tr
+ rm -f t _temp_* _temp_*.* *.map *.sym
+ rm -f ansi2knr$(XE) echogs$(XE) genarch$(XE) genconf$(XE)
+ rm -f $(GS)$(XE) $(BEGINFILES)
+
+ # A rule to do a quick and dirty compilation attempt when first installing
+ # Ghostscript. Many of the compilations will fail: follow this with 'make'.
+
+ begin:
+ rm -f arch.h genarch$(XE) $(GS)$(XE) $(BEGINFILES)
+ make arch.h
+ - $(CCBEGIN)
+ rm -f gconfig.$(OBJ) gdev*.$(OBJ) gp_*.$(OBJ) gsmisc.$(OBJ)
+ rm -f iccfont.$(OBJ) iinit.$(OBJ) interp.$(OBJ) zfiledev.$(OBJ)
+
+ # Auxiliary programs
+
+ arch.h: genarch$(XE)
+ $(EXPP) $(EXP)genarch arch.h
+
+ # -------------------------------- Library -------------------------------- #
+
+ # Define the inter-dependencies of the .h files.
+ # Since not all versions of `make' defer expansion of macros,
+ # we must list these in bottom-to-top order.
+
+ # Generic files
+
+ arch_h=arch.h
+ std_h=std.h $(arch_h)
+
+ # Platform interfaces
+
+ gp_h=gp.h
+ gpcheck_h=gpcheck.h
+
+ # C library interfaces
+
+ # Because of variations in the "standard" header files between systems, and
+ # because we must include std.h before any file that includes sys/types.h,
+ # we define local include files named *_.h to substitute for <*.h>.
+
+ vmsmath_h=vmsmath.h
+
+ dos__h=dos_.h
+ ctype__h=ctype_.h $(std_h)
+ errno__h=errno_.h
+ malloc__h=malloc_.h $(std_h)
+ math__h=math_.h $(std_h) $(vmsmath_h)
+ memory__h=memory_.h $(std_h)
+ stat__h=stat_.h $(std_h)
+ stdio__h=stdio_.h $(std_h)
+ string__h=string_.h $(std_h)
+ time__h=time_.h $(std_h)
+ windows__h=windows_.h
+
+ # Miscellaneous
+
+ gdebug_h=gdebug.h
+ gsio_h=gsio.h
+ gstypes_h=gstypes.h
+ gs_h=gs.h $(stdio__h) $(gsio_h) $(gstypes_h)
+ gx_h=gx.h $(gs_h) $(gdebug_h)
+ gconfig_h=gconfig.h gsconfig.h
+ gserrors_h=gserrors.h
+
+ GX=$(AK) $(gx_h)
+ GXERR=$(GX) $(gserrors_h)
+
+ ###### Low-level facilities and utilities
+
+ ### Include files
+
+ gsccode_h=gsccode.h
+ gschar_h=gschar.h $(gsccode_h)
+ gscie_h=gscie.h
+ gscolor_h=gscolor.h
+ gscolor2_h=gscolor2.h
+ gscoord_h=gscoord.h
+ gscrypt1_h=gscrypt1.h
+ gscspace_h=gscspace.h
+ gsfont_h=gsfont.h
+ gsimage_h=gsimage.h
+ gsmatrix_h=gsmatrix.h
+ gspaint_h=gspaint.h
+ gspath_h=gspath.h
+ gsprops_h=gsprops.h
+ gsstate_h=gsstate.h $(gscolor_h)
+ gstype1_h=gstype1.h
+ gsuid_h=gsuid.h
+ gsutil_h=gsutil.h
+ gsxfont_h=gsxfont.h
+
+ gxarith_h=gxarith.h
+ gxbitmap_h=gxbitmap.h
+ gxcache_h=gxcache.h $(gsuid_h) $(gsxfont_h)
+ gxcdir_h=gxcdir.h
+ gxchar_h=gxchar.h $(gschar_h)
+ gxclist_h=gxclist.h
+ # gxcldev is out of order because it include gxclist.
+ gxcldev_h=gxcldev.h $(gxclist_h)
+ gxcpath_h=gxcpath.h
+ gxdevice_h=gxdevice.h $(gsmatrix_h) $(gsxfont_h) $(gxbitmap_h)
+ gxdevmem_h=gxdevmem.h
+ gxfdir_h=gxfdir.h $(gxcdir_h)
+ gxfixed_h=gxfixed.h
+ gxfont_h=gxfont.h $(gsfont_h) $(gsuid_h)
+ gxfrac_h=gxfrac.h
+ gximage_h=gximage.h $(gscspace_h) $(gsimage_h)
+ gxlum_h=gxlum.h
+ gxmatrix_h=gxmatrix.h $(gsmatrix_h)
+ gxop1_h=gxop1.h
+ gxpath_h=gxpath.h
+ gxrefct_h=gxrefct.h
+ gxtype1_h=gxtype1.h $(gscrypt1_h) $(gstype1_h)
+ gxxfont_h=gxxfont.h $(gsccode_h) $(gsmatrix_h) $(gsuid_h) $(gsxfont_h)
+ # gxcolor and gxfmap are out of order because they include other files.
+ gxcolor_h=gxcolor.h $(gxfrac_h) $(gsuid_h)
+ gxfmap_h=gxfmap.h $(gxfrac_h) $(gxrefct_h)
+
+ gzcolor_h=gzcolor.h $(gscolor_h) $(gxfmap_h) $(gxlum_h)
+ gzdevice_h=gzdevice.h $(gxdevice_h)
+ gzht_h=gzht.h
+ gzline_h=gzline.h
+ gzpath_h=gzpath.h $(gxpath_h)
+ gzstate_h=gzstate.h $(gsstate_h) $(gxfixed_h) $(gxmatrix_h)
+
+ ### Executable code
+
+ gp_nofb.$(OBJ): gp_nofb.c $(AK) \
+ $(gx_h) $(gp_h) $(gxdevice_h)
+
+ gsutil.$(OBJ): gsutil.c $(AK) \
+ $(std_h) $(gsprops_h) $(gsutil_h)
+
+ gxccache.$(OBJ): gxccache.c $(GXERR) $(gpcheck_h) \
+ $(gxfixed_h) $(gxmatrix_h) $(gzdevice_h) $(gzcolor_h) \
+ $(gxcpath_h) $(gxdevmem_h) $(gxfont_h) $(gxfdir_h) $(gxchar_h) \
+ $(gxcache_h) $(gxxfont_h) $(gzstate_h) $(gzpath_h) \
+ $(gscspace_h) $(gsimage_h)
+
+ gxccman.$(OBJ): gxccman.c $(GXERR) $(gpcheck_h) \
+ $(gxfixed_h) $(gxmatrix_h) $(gzdevice_h) $(gzcolor_h) \
+ $(gxcpath_h) $(gxdevmem_h) $(gxfont_h) $(gxfdir_h) $(gxchar_h) \
+ $(gxcache_h) $(gxxfont_h) $(gzstate_h) $(gzpath_h)
+
+ gxclist.$(OBJ): gxclist.c $(GXERR) $(gpcheck_h) \
+ $(gsmatrix_h) $(gxbitmap_h) $(gxcldev_h) $(gxdevice_h) $(gxdevmem_h)
+
+ gxclread.$(OBJ): gxclread.c $(GXERR) $(gpcheck_h) \
+ $(gsmatrix_h) $(gxbitmap_h) $(gxcldev_h) $(gxdevice_h) $(gxdevmem_h)
+
+ gxcmap.$(OBJ): gxcmap.c $(GXERR) \
+ $(gscspace_h) \
+ $(gxcolor_h) $(gxdevice_h) $(gxfrac_h) $(gxlum_h) \
+ $(gzcolor_h) $(gzstate_h)
+
+ gxcpath.$(OBJ): gxcpath.c $(GXERR) \
+ $(gxdevice_h) $(gxfixed_h) $(gzcolor_h) $(gzpath_h) $(gxcpath_h)
+
+ gxdither.$(OBJ): gxdither.c $(GX) \
+ $(gxfixed_h) $(gxlum_h) $(gxmatrix_h) $(gzstate_h) $(gzdevice_h) $(gzcolor_h) $(gzht_h)
+
+ gxdraw.$(OBJ): gxdraw.c $(GXERR) $(gpcheck_h) \
+ $(gxfixed_h) $(gxmatrix_h) $(gxbitmap_h) $(gzcolor_h) $(gzdevice_h) $(gzstate_h)
+
+ gxfill.$(OBJ): gxfill.c $(GXERR) \
+ $(gxfixed_h) $(gxmatrix_h) $(gxdevice_h) $(gzcolor_h) $(gzpath_h) $(gzstate_h) $(gxcpath_h)
+
+ gxhint1.$(OBJ): gxhint1.c $(GXERR) \
+ $(gxarith_h) $(gxfixed_h) $(gxmatrix_h) $(gxdevmem_h) $(gxchar_h) $(gxfont_h) $(gxtype1_h) \
+ $(gzdevice_h) $(gzstate_h)
+
+ gxhint2.$(OBJ): gxhint2.c $(GXERR) \
+ $(gxarith_h) $(gxfixed_h) $(gxmatrix_h) $(gxdevmem_h) $(gxchar_h) $(gxfont_h) $(gxtype1_h) $(gxop1_h) \
+ $(gzdevice_h) $(gzstate_h)
+
+ gxht.$(OBJ): gxht.c $(GXERR) \
+ $(gxfixed_h) $(gxmatrix_h) $(gxbitmap_h) $(gzstate_h) $(gzcolor_h) $(gzdevice_h) $(gzht_h)
+
+ gxpath.$(OBJ): gxpath.c $(GXERR) \
+ $(gxfixed_h) $(gzpath_h)
+
+ gxpath2.$(OBJ): gxpath2.c $(GXERR) \
+ $(gxfixed_h) $(gxarith_h) $(gzpath_h)
+
+ gxpcopy.$(OBJ): gxpcopy.c $(GXERR) \
+ $(gxfixed_h) $(gxarith_h) $(gzpath_h)
+
+ gxstroke.$(OBJ): gxstroke.c $(GXERR) $(gpcheck_h) \
+ $(gscoord_h) $(gxfixed_h) $(gxarith_h) $(gxmatrix_h) \
+ $(gzstate_h) $(gzcolor_h) $(gzdevice_h) $(gzline_h) $(gzpath_h)
+
+ ###### High-level facilities
+
+ gschar.$(OBJ): gschar.c $(GXERR) \
+ $(gxfixed_h) $(gxarith_h) $(gxmatrix_h) $(gzdevice_h) $(gxdevmem_h) $(gxfont_h) $(gxchar_h) $(gxcache_h) $(gstype1_h) $(gspath_h) $(gzpath_h) $(gzcolor_h) $(gzstate_h)
+
+ gscolor.$(OBJ): gscolor.c $(GXERR) \
+ $(gscspace_h) $(gxcolor_h) $(gxdevice_h) $(gxrefct_h) \
+ $(gzstate_h) $(gzcolor_h)
+
+ gscoord.$(OBJ): gscoord.c $(GXERR) \
+ $(gsccode_h) $(gxarith_h) $(gxfixed_h) $(gxfont_h) $(gxmatrix_h) \
+ $(gzdevice_h) $(gzstate_h) $(gscoord_h)
+
+ gsdevice.$(OBJ): gsdevice.c $(GXERR) \
+ $(gxarith_h) $(gsprops_h) $(gsutil_h) $(gxbitmap_h) $(gxdevmem_h) \
+ $(gzstate_h) $(gzdevice_h)
+
+ gsfile.$(OBJ): gsfile.c $(GXERR) \
+ $(gsmatrix_h) $(gxdevice_h) $(gxdevmem_h)
+
+ gsfont.$(OBJ): gsfont.c $(GXERR) \
+ $(gxdevice_h) $(gxfixed_h) $(gxmatrix_h) $(gxfont_h) $(gxfdir_h) \
+ $(gzstate_h)
+
+ gsht.$(OBJ): gsht.c $(GXERR) \
+ $(gzht_h) $(gzstate_h)
+
+ gsimage.$(OBJ): gsimage.c $(GXERR) $(gpcheck_h) \
+ $(gxfixed_h) $(gxarith_h) $(gxmatrix_h) $(gspaint_h) \
+ $(gzcolor_h) $(gzdevice_h) $(gzpath_h) $(gzstate_h) \
+ $(gxcolor_h) $(gxcpath_h) $(gxdevmem_h) $(gximage_h)
+
+ gsimage1.$(OBJ): gsimage1.c $(GXERR) $(gpcheck_h) \
+ $(gxfixed_h) $(gxarith_h) $(gxmatrix_h) $(gscspace_h) $(gspaint_h) \
+ $(gzcolor_h) $(gzdevice_h) $(gzpath_h) $(gzstate_h) \
+ $(gxcolor_h) $(gxcpath_h) $(gxdevmem_h) $(gximage_h)
+
+ gsimage2.$(OBJ): gsimage2.c $(GXERR) $(gpcheck_h) \
+ $(gxfixed_h) $(gxarith_h) $(gxmatrix_h) $(gscspace_h) $(gspaint_h) \
+ $(gzcolor_h) $(gzdevice_h) $(gzpath_h) $(gzstate_h) \
+ $(gxcolor_h) $(gxcpath_h) $(gxdevmem_h) $(gximage_h)
+
+ gsimpath.$(OBJ): gsimpath.c $(GXERR) \
+ $(gsmatrix_h) $(gsstate_h) $(gspath_h)
+
+ gsline.$(OBJ): gsline.c $(GXERR) \
+ $(gxfixed_h) $(gxmatrix_h) $(gzstate_h) $(gzline_h)
+
+ gsmatrix.$(OBJ): gsmatrix.c $(GXERR) \
+ $(gxfixed_h) $(gxarith_h) $(gxmatrix_h)
+
+ gsmisc.$(OBJ): gsmisc.c $(GX) $(errno__h) $(malloc__h) $(memory__h) $(MAKEFILE)
+ $(CCC) -DUSE_ASM=0$(USE_ASM) gsmisc.c
+
+ gspaint.$(OBJ): gspaint.c $(GXERR) $(gpcheck_h) \
+ $(gxfixed_h) $(gxmatrix_h) $(gspaint_h) $(gzpath_h) $(gzstate_h) $(gzdevice_h) $(gxcpath_h) $(gxdevmem_h) $(gximage_h)
+
+ gspath.$(OBJ): gspath.c $(GXERR) \
+ $(gxfixed_h) $(gxmatrix_h) $(gxpath_h) $(gzstate_h)
+
+ gspath2.$(OBJ): gspath2.c $(GXERR) \
+ $(gspath_h) $(gxfixed_h) $(gxmatrix_h) $(gzstate_h) $(gzpath_h) $(gzdevice_h)
+
+ gsstate.$(OBJ): gsstate.c $(GXERR) \
+ $(gscie_h) $(gscolor2_h) $(gscspace_h) $(gxcolor_h) $(gxrefct_h) \
+ $(gzstate_h) $(gzcolor_h) $(gzdevice_h) $(gzht_h) $(gzline_h) $(gzpath_h)
+
+ gstdev.$(OBJ): gstdev.c $(GXERR) \
+ $(gxbitmap_h) $(gxdevice_h) $(gxfixed_h) $(gxmatrix_h)
+
+ gstype1.$(OBJ): gstype1.c $(GXERR) \
+ $(gxarith_h) $(gxfixed_h) $(gxmatrix_h) $(gxchar_h) $(gxdevmem_h) $(gxop1_h) $(gxtype1_h) \
+ $(gzstate_h) $(gzdevice_h) $(gzpath_h)
+
+ ###### The internal devices
+
+ gdevmem_h=gdevmem.h
+
+ gdevemap.$(OBJ): gdevemap.c $(AK) $(std_h)
+
+ gdevmem1.$(OBJ): gdevmem1.c $(AK) \
+ $(gx_h) $(gserrors_h) $(gxdevice_h) $(gxdevmem_h) $(gdevmem_h)
+
+ gdevmem2.$(OBJ): gdevmem2.c $(AK) \
+ $(gx_h) $(gxdevice_h) $(gxdevmem_h) $(gdevmem_h)
+
+ gdevmem3.$(OBJ): gdevmem3.c $(AK) \
+ $(gx_h) $(gxdevice_h) $(gxdevmem_h) $(gdevmem_h)
+
+ ###### Files dependent on the installed devices, features, and platform.
+ # Generating gconfig.h also generates o*.tr and l*.tr.
+
+ # gconfig.h shouldn't have to depend on ALL_DEVS, but that would
+ # involve rewriting gsconfig to only save the device name, not the
+ # contents of the <device>.D_# files.
+
+ ALL_DEVS=$(FEATURE_DEVS) $(PLATFORM).dev \
+ $(DEVICE_DEVS) $(DEVICE_DEVS1) \
+ $(DEVICE_DEVS2) $(DEVICE_DEVS3) $(DEVICE_DEVS4) $(DEVICE_DEVS5)\
+ $(DEVICE_DEVS6) $(DEVICE_DEVS7) $(DEVICE_DEVS8) $(DEVICE_DEVS9)
+
+ gconfig.h obj.tr objw.tr ld.tr lib.tr: \
+ devs.mak $(MAKEFILE) echogs$(XE) genconf$(XE) $(ALL_DEVS)
+ $(EXP)echogs -w t.cfg - $(FEATURE_DEVS) $(PLATFORM).dev
+ $(EXP)echogs -a t.cfg - $(DEVICE_DEVS)
+ $(EXP)echogs -a t.cfg - $(DEVICE_DEVS1)
+ $(EXP)echogs -a t.cfg - $(DEVICE_DEVS2)
+ $(EXP)echogs -a t.cfg - $(DEVICE_DEVS3)
+ $(EXP)echogs -a t.cfg - $(DEVICE_DEVS4)
+ $(EXP)echogs -a t.cfg - $(DEVICE_DEVS5)
+ $(EXP)echogs -a t.cfg - $(DEVICE_DEVS6)
+ $(EXP)echogs -a t.cfg - $(DEVICE_DEVS7)
+ $(EXP)echogs -a t.cfg - $(DEVICE_DEVS8)
+ $(EXP)echogs -a t.cfg - $(DEVICE_DEVS9)
+ $(EXP)genconf @t.cfg -h gconfig.h -l lib.tr -o obj.tr -u ld.tr -w objw.tr
+ rm t.cfg
+ $(EXP)echogs -a gconfig.h -x 23 define GS_LIB_DEFAULT -x 2022 $(GS_LIB_DEFAULT) -x 22
+ $(EXP)echogs -a gconfig.h -x 23 define GS_INIT -x 2022 $(GS_INIT) -x 22
+
+ gconfig.$(OBJ): gconfig.c $(AK) $(gconfig_h) $(MAKEFILE)
+
+ ###### On Unix, we pre-link all of the library except the back end.
+ ###### On MS-DOS, we have to do the whole thing at once.
+
+ LIBGS=gschar.$(OBJ) gscolor.$(OBJ) gscoord.$(OBJ) \
+ gsdevice.$(OBJ) gsfile.$(OBJ) gsfont.$(OBJ) gsht.$(OBJ) \
+ gsimage.$(OBJ) gsimage1.$(OBJ) gsimage2.$(OBJ) \
+ gsimpath.$(OBJ) gsline.$(OBJ) gsmatrix.$(OBJ) gsmisc.$(OBJ) \
+ gspaint.$(OBJ) gspath.$(OBJ) gspath2.$(OBJ) \
+ gsstate.$(OBJ) gstdev.$(OBJ) gstype1.$(OBJ) gsutil.$(OBJ) \
+ gxccache.$(OBJ) gxccman.$(OBJ) gxclist.$(OBJ) gxclread.$(OBJ) \
+ gxcmap.$(OBJ) gxcpath.$(OBJ) \
+ gxdither.$(OBJ) gxdraw.$(OBJ) gxfill.$(OBJ) \
+ gxhint1.$(OBJ) gxhint2.$(OBJ) gxht.$(OBJ) \
+ gxpath.$(OBJ) gxpath2.$(OBJ) gxpcopy.$(OBJ) gxstroke.$(OBJ) \
+ gdevmem1.$(OBJ) gdevmem2.$(OBJ) gdevmem3.$(OBJ) gconfig.$(OBJ)
+
+ # ------------------------------ Interpreter ------------------------------ #
+
+ ###### Include files
+
+ alloc_h=alloc.h
+ astate_h=astate.h
+ ccfont_h=ccfont.h
+ dict_h=dict.h
+ dparam_h=dparam.h
+ dstack_h=dstack.h
+ errors_h=errors.h
+ estack_h=estack.h
+ filedev_h=filedev.h
+ files_h=files.h
+ font_h=font.h
+ ilevel_h=ilevel.h
+ iname_h=iname.h
+ iref_h=iref.h
+ iscan_h=iscan.h
+ ivmspace_h=ivmspace.h
+ iutil_h=iutil.h
+ main_h=main.h
+ opdef_h=opdef.h
+ ostack_h=ostack.h
+ overlay_h=overlay.h
+ packed_h=packed.h
+ save_h=save.h
+ scanchar_h=scanchar.h
+ sbits_h=sbits.h
+ shc_h=shc.h
+ state_h=state.h
+ store_h=store.h
+ stream_h=stream.h
+ # Nested include files
+ bfont_h=bfont.h $(font_h)
+ ghost_h=ghost.h $(gx_h) $(iref_h)
+ oper_h=oper.h $(gsutil_h) $(iutil_h) $(opdef_h) $(ostack_h)
+ scf_h=scf.h $(shc_h)
+ sdct_h=sdct.h $(shc_h)
+ # Include files for optional features
+ bnum_h=bnum.h
+ bseq_h=bseq.h
+ btoken_h=btoken.h
+
+ comp1_h=comp1.h $(ghost_h) $(oper_h) $(gserrors_h) $(gxfixed_h) $(gxop1_h)
+
+ gdevprn_h=gdevprn.h $(memory__h) $(string__h) $(gx_h) \
+ $(gserrors_h) $(gsmatrix_h) $(gxdevice_h) $(gxdevmem_h) $(gxclist_h)
+
+ ###### Utilities
+
+ GH=$(AK) $(ghost_h)
+
+ ialloc.$(OBJ): ialloc.c $(AK) $(gx_h) $(alloc_h) $(astate_h) $(ivmspace_h)
+
+ iccfont.$(OBJ): iccfont.c $(GH) gconfigf.h \
+ $(ghost_h) $(alloc_h) $(ccfont_h) $(dict_h) $(dstack_h) $(errors_h) \
+ $(font_h) $(iutil_h) $(iname_h) $(oper_h) $(save_h) $(store_h)
+
+ idebug.$(OBJ): idebug.c $(GH) \
+ $(iutil_h) $(dict_h) $(iname_h) $(ostack_h) $(opdef_h) $(packed_h) $(store_h)
+
+ idict.$(OBJ): idict.c $(GH) \
+ $(alloc_h) $(errors_h) $(ivmspace_h) $(iname_h) $(packed_h) \
+ $(save_h) $(store_h) $(iutil_h) $(dict_h) $(dstack_h)
+
+ idparam.$(OBJ): idparam.c $(GH) \
+ $(gsmatrix_h) $(dict_h) $(dparam_h) $(errors_h) $(iutil_h)
+
+ iinit.$(OBJ): iinit.c $(GH) $(gconfig_h) \
+ $(alloc_h) $(dict_h) $(dstack_h) $(errors_h) $(ilevel_h) $(iname_h) $(oper_h) $(store_h)
+
+ iname.$(OBJ): iname.c $(GH) $(alloc_h) $(errors_h) $(ivmspace_h) $(iname_h) $(store_h)
+
+ isave.$(OBJ): isave.c $(GH) $(alloc_h) $(astate_h) $(errors_h) $(iname_h) $(packed_h) $(save_h) $(store_h)
+
+ iscan.$(OBJ): iscan.c $(GH) $(ctype__h) \
+ $(alloc_h) $(dict_h) $(dstack_h) $(errors_h) \
+ $(ilevel_h) $(iutil_h) $(iscan_h) $(ivmspace_h) \
+ $(iname_h) $(ostack_h) $(packed_h) $(store_h) $(stream_h) $(scanchar_h)
+
+ iutil.$(OBJ): iutil.c $(GH) \
+ $(errors_h) $(alloc_h) $(dict_h) $(iutil_h) $(ivmspace_h) \
+ $(iname_h) $(ostack_h) $(opdef_h) $(packed_h) $(store_h) \
+ $(gsmatrix_h) $(gxdevice_h) $(gzcolor_h)
+
+ sfilter.$(OBJ): sfilter.c $(AK) $(stdio__h) \
+ $(scanchar_h) $(stream_h) $(gscrypt1_h)
+
+ stream.$(OBJ): stream.c $(AK) $(stdio__h) $(memory__h) \
+ $(gpcheck_h) $(scanchar_h) $(stream_h)
+
+ ###### Operators
+
+ OP=$(GH) $(errors_h) $(oper_h)
+
+ ### Non-graphics operators
+
+ zarith.$(OBJ): zarith.c $(OP) $(store_h)
+
+ zarray.$(OBJ): zarray.c $(OP) $(alloc_h) $(packed_h) $(store_h)
+
+ zcontrol.$(OBJ): zcontrol.c $(OP) $(estack_h) $(iutil_h) $(store_h)
+
+ zdict.$(OBJ): zdict.c $(OP) $(dict_h) $(dstack_h) $(iname_h) $(store_h)
+
+ zfile.$(OBJ): zfile.c $(OP) $(gp_h) \
+ $(alloc_h) $(estack_h) $(filedev_h) $(files_h) $(ilevel_h) $(iutil_h) \
+ $(save_h) $(stream_h) $(store_h)
+
+ zfiledev.$(OBJ): zfiledev.c $(OP) $(string__h) $(gp_h) $(gconfig_h) \
+ $(filedev_h) $(files_h) $(stream_h)
+
+ zfileio.$(OBJ): zfileio.c $(OP) $(gp_h) \
+ $(estack_h) $(files_h) $(iscan_h) $(store_h) $(stream_h) \
+ $(gsmatrix_h) $(gxdevice_h) $(gxdevmem_h)
+
+ zfilter.$(OBJ): zfilter.c $(OP) $(alloc_h) $(stream_h)
+
+ zgeneric.$(OBJ): zgeneric.c $(OP) \
+ $(dict_h) $(estack_h) $(ivmspace_h) $(iname_h) $(packed_h) $(store_h)
+
+ zmath.$(OBJ): zmath.c $(OP) $(store_h)
+
+ zmisc.$(OBJ): zmisc.c $(OP) $(gp_h) $(errno__h) $(memory__h) $(string__h) \
+ $(alloc_h) $(dict_h) $(dstack_h) $(iname_h) $(ivmspace_h) $(packed_h) $(store_h) \
+ $(gscrypt1_h)
+
+ zpacked.$(OBJ): zpacked.c $(OP) \
+ $(alloc_h) $(dict_h) $(ivmspace_h) $(iname_h) $(packed_h) $(save_h) $(store_h)
+
+ zprops.$(OBJ): zprops.c $(OP) \
+ $(alloc_h) $(dict_h) $(iname_h) $(state_h) $(store_h) \
+ $(gsprops_h) $(gsmatrix_h) $(gxdevice_h) $(gsstate_h)
+
+ zrelbit.$(OBJ): zrelbit.c $(OP) $(store_h) $(dict_h)
+
+ zstack.$(OBJ): zstack.c $(OP) $(store_h)
+
+ zstring.$(OBJ): zstring.c $(OP) \
+ $(alloc_h) $(iscan_h) $(iutil_h) $(iname_h) $(store_h) $(stream_h)
+
+ ztype.$(OBJ): ztype.c $(OP) \
+ $(dict_h) $(iscan_h) $(iutil_h) $(iname_h) $(stream_h) $(store_h)
+
+ zvmem.$(OBJ): zvmem.c $(OP) $(alloc_h) $(dict_h) $(dstack_h) $(estack_h) $(save_h) $(state_h) $(store_h) \
+ $(gsmatrix_h) $(gsstate_h)
+
+ ###### Graphics operators
+
+ zchar.$(OBJ): zchar.c $(OP) $(gxarith_h) $(gxfixed_h) $(gxmatrix_h) \
+ $(gschar_h) $(gxtype1_h) $(gxdevice_h) $(gxfont_h) $(gzpath_h) $(gzstate_h) \
+ $(alloc_h) $(dict_h) $(font_h) $(estack_h) $(ilevel_h) $(iname_h) $(state_h) $(store_h)
+
+ zcolor.$(OBJ): zcolor.c $(OP) $(alloc_h) $(estack_h) $(gxfixed_h) $(gxmatrix_h) $(gzstate_h) $(gxdevice_h) $(gzcolor_h) $(iutil_h) $(state_h) $(store_h)
+
+ zdevice.$(OBJ): zdevice.c $(OP) $(alloc_h) $(state_h) $(gsmatrix_h) $(gsstate_h) $(gxdevice_h) $(store_h)
+
+ zfont.$(OBJ): zfont.c $(OP) \
+ $(gsmatrix_h) $(gxdevice_h) $(gxfont_h) $(gxfdir_h) $(gxcache_h) \
+ $(alloc_h) $(bfont_h) $(dict_h) $(iname_h) $(packed_h) $(save_h) $(state_h) $(store_h)
+
+ zfont1.$(OBJ): zfont1.c $(OP) $(gsmatrix_h) $(gxdevice_h) $(gschar_h) $(gxfixed_h) $(gxfont_h) \
+ $(bfont_h) $(dict_h) $(dparam_h) $(iname_h) $(store_h)
+
+ zfont2.$(OBJ): zfont2.c $(OP) $(gsmatrix_h) $(gxdevice_h) $(gschar_h) $(gxfixed_h) $(gxfont_h) \
+ $(alloc_h) $(bfont_h) $(dict_h) $(dparam_h) $(ilevel_h) $(iname_h) \
+ $(packed_h) $(save_h) $(store_h)
+
+ zgstate.$(OBJ): zgstate.c $(OP) $(alloc_h) $(gsmatrix_h) $(gsstate_h) $(state_h) $(store_h)
+
+ zht.$(OBJ): zht.c $(OP) $(alloc_h) $(estack_h) $(gsmatrix_h) $(gsstate_h) $(state_h) $(store_h)
+
+ zmatrix.$(OBJ): zmatrix.c $(OP) $(gsmatrix_h) $(state_h) $(gscoord_h) $(store_h)
+
+ zpaint.$(OBJ): zpaint.c $(OP) \
+ $(alloc_h) $(estack_h) $(ilevel_h) $(state_h) $(store_h) $(stream_h) \
+ $(gsimage_h) $(gsmatrix_h) $(gspaint_h)
+
+ zpath.$(OBJ): zpath.c $(OP) $(gsmatrix_h) $(gspath_h) $(state_h) $(store_h)
+
+ zpath2.$(OBJ): zpath2.c $(OP) $(alloc_h) $(estack_h) $(gspath_h) $(state_h) $(store_h)
+
+ ###### Linking
+
+ INT=ialloc.$(OBJ) idebug.$(OBJ) idict.$(OBJ) idparam.$(OBJ) \
+ iinit.$(OBJ) iname.$(OBJ) \
+ interp.$(OBJ) isave.$(OBJ) iscan.$(OBJ) iutil.$(OBJ) \
+ sfilter.$(OBJ) stream.$(OBJ) \
+ zarith.$(OBJ) zarray.$(OBJ) zcontrol.$(OBJ) zdict.$(OBJ) \
+ zfile.$(OBJ) zfiledev.$(OBJ) zfileio.$(OBJ) zfilter.$(OBJ) zgeneric.$(OBJ) \
+ zmath.$(OBJ) zmisc.$(OBJ) zpacked.$(OBJ) zprops.$(OBJ) zrelbit.$(OBJ) \
+ zstack.$(OBJ) zstring.$(OBJ) ztype.$(OBJ) zvmem.$(OBJ) \
+ zchar.$(OBJ) zcolor.$(OBJ) zfont.$(OBJ) zfont1.$(OBJ) zfont2.$(OBJ) \
+ zdevice.$(OBJ) zgstate.$(OBJ) zht.$(OBJ) zmatrix.$(OBJ) \
+ zpaint.$(OBJ) zpath.$(OBJ) zpath2.$(OBJ)
+
+ # -------------------------- Optional features ---------------------------- #
+
+ ### Additions common to Display PostScript and Level 2
+
+ # We have to split up the module list because of limitations
+ # on the number of arguments to a DOS batch file.
+ dpsand2a_=gsdps1.$(OBJ) ibnum.$(OBJ) iscan2.$(OBJ)
+ dpsand2b_=zbseq.$(OBJ) zchar2.$(OBJ) zdps1.$(OBJ) zupath.$(OBJ) zvmem2.$(OBJ)
+ dpsand2_=$(dpsand2a_) $(dpsand2b_)
+ dpsand2.dev: $(dpsand2_) gssetmod gsaddmod
+ $(SHP)gssetmod dpsand2 $(dpsand2a_)
+ $(SHP)gsaddmod dpsand2 -obj $(dpsand2b_)
+ $(SHP)gsaddmod dpsand2 -oper2 zbseq zchar2 zdps1 zupath zvmem2
+ $(SHP)gsaddmod dpsand2 -ps gs_dps1
+
+ gsdps1.$(OBJ): gsdps1.c $(GXERR) $(gxfixed_h) $(gxmatrix_h) $(gzpath_h) $(gzstate_h)
+
+ ibnum.$(OBJ): ibnum.c $(GH) $(errors_h) $(stream_h) $(bnum_h) $(btoken_h)
+
+ iscan2.$(OBJ): iscan2.c $(GH) $(errors_h) \
+ $(alloc_h) $(dict_h) $(dstack_h) $(iscan_h) $(iutil_h) $(ivmspace_h) \
+ $(iname_h) $(ostack_h) $(save_h) $(store_h) $(stream_h) \
+ $(bseq_h) $(btoken_h) $(bnum_h)
+
+ zbseq.$(OBJ): zbseq.c $(OP) $(save_h) $(store_h) $(stream_h) $(files_h) $(iname_h) $(bnum_h) $(btoken_h) $(bseq_h)
+
+ zchar2.$(OBJ): zchar2.c $(OP) $(gschar_h) $(gsmatrix_h) $(gxfixed_h) $(gxfont_h) \
+ $(alloc_h) $(estack_h) $(font_h) $(iname_h) $(state_h) $(store_h) $(stream_h) $(bnum_h)
+
+ zdps1.$(OBJ): zdps1.c $(OP) $(gsmatrix_h) $(gspath_h) $(gsstate_h) \
+ $(alloc_h) $(ivmspace_h) $(state_h) $(store_h) $(stream_h) $(bnum_h)
+
+ zupath.$(OBJ): zupath.c $(OP) \
+ $(dict_h) $(dstack_h) $(iutil_h) $(state_h) $(store_h) $(stream_h) $(bnum_h) \
+ $(gscoord_h) $(gsmatrix_h) $(gspaint_h) $(gspath_h) $(gsstate_h) \
+ $(gxfixed_h) $(gxdevice_h) $(gxpath_h)
+
+ zvmem2.$(OBJ): zvmem2.c $(OP) \
+ $(ivmspace_h) $(store_h)
+
+ ### Display PostScript
+ # We should include zcontext, but it isn't in good enough shape yet:
+ # $(SHP)gsaddmod dps -oper2 zcontext
+
+ dps_=
+ dps.dev: dpsand2.dev $(dps_) gssetmod gsaddmod
+ $(SHP)gssetmod dps $(dps_)
+ $(SHP)gsaddmod dps -include dpsand2
+
+ zcontext.$(OBJ): zcontext.c $(OP) \
+ $(alloc_h) $(dict_h) $(dstack_h) $(estack_h) $(state_h) $(store_h)
+
+ ### Composite font support
+
+ gschar0.$(OBJ): gschar0.c $(GXERR) \
+ $(gxfixed_h) $(gxmatrix_h) $(gzdevice_h) $(gxdevmem_h) $(gxfont_h) $(gxchar_h) $(gzstate_h)
+
+ zfont0.$(OBJ): zfont0.c $(OP) $(gsmatrix_h) $(gxdevice_h) $(gxfont_h) \
+ $(alloc_h) $(bfont_h) $(dict_h) $(iname_h) $(state_h) $(store_h)
+
+ compfont_=zchar2.$(OBJ) zfont0.$(OBJ) gschar0.$(OBJ)
+ compfont.dev: $(compfont_) gssetmod gsaddmod
+ $(SHP)gssetmod compfont $(compfont_)
+ $(SHP)gsaddmod compfont -oper zfont0 zchar2
+ $(SHP)gsaddmod compfont -ps gs_type0
+
+ ### Level 2 additions
+
+ # We have to split up the module list because of limitations
+ # on the number of arguments to a DOS batch file.
+ level2a_=gscie.$(OBJ) gscolor2.$(OBJ) zcie.$(OBJ) zcolor2.$(OBJ)
+ level2b_=zcspace2.$(OBJ) zht2.$(OBJ) zimage2.$(OBJ) zmisc2.$(OBJ)
+ level2_=$(level2a_) $(level2b_)
+ level2.dev: compfont.dev dpsand2.dev filter.dev $(level2_) gssetmod gsaddmod
+ $(SHP)gssetmod level2 $(level2a_)
+ $(SHP)gsaddmod level2 -obj $(level2b_)
+ $(SHP)gsaddmod level2 -include compfont dpsand2 filter
+ $(SHP)gsaddmod level2 -oper zmisc2_level
+ $(SHP)gsaddmod level2 -oper2 zcie zcolor2 zcspace2
+ $(SHP)gsaddmod level2 -oper2 zht2 zimage2 zmisc2
+ $(SHP)gsaddmod level2 -ps gs_lev2
+
+ gscie.$(OBJ): gscie.c $(GXERR) \
+ $(gscspace_h) $(gscie_h) $(gscolor2_h) \
+ $(gxarith_h) $(gxcolor_h) $(gxdevice_h) $(gxrefct_h) \
+ $(gzcolor_h) $(gzstate_h)
+
+ gscolor2.$(OBJ): gscolor2.c $(GXERR) \
+ $(gscie_h) $(gscolor2_h) $(gscspace_h) \
+ $(gxcolor_h) $(gxdevice_h) $(gxfixed_h) $(gxmatrix_h) $(gxrefct_h) \
+ $(gzcolor_h) $(gzstate_h)
+
+ zcie.$(OBJ): zcie.c $(OP) \
+ $(gscspace_h) $(gscolor2_h) $(gscie_h) $(gxcolor_h) $(gxrefct_h) \
+ $(alloc_h) $(dict_h) $(dparam_h) $(estack_h) $(save_h) $(state_h) $(store_h)
+
+ zcolor2.$(OBJ): zcolor2.c $(OP) \
+ $(gscolor_h) $(gxcolor_h) $(gscolor2_h) $(gscspace_h) $(gsmatrix_h) \
+ $(dict_h) $(dparam_h) $(iname_h) $(state_h) $(store_h)
+
+ zcspace2.$(OBJ): zcspace2.c $(OP) \
+ $(gscolor_h) $(gxcolor_h) $(gscolor2_h) $(gscspace_h) $(gsmatrix_h) \
+ $(dict_h) $(dparam_h) $(estack_h) $(iname_h) $(state_h) $(store_h)
+
+ zht2.$(OBJ): zht2.c $(OP) \
+ $(dict_h) $(dparam_h) $(iname_h) $(state_h) $(store_h)
+
+ zimage2.$(OBJ): zimage2.c $(OP) \
+ $(gscolor_h) $(gscolor2_h) $(gscspace_h) $(gsmatrix_h) $(gxcolor_h) \
+ $(dict_h) $(dparam_h) $(ilevel_h) $(state_h)
+
+ zmisc2.$(OBJ): zmisc2.c $(OP) \
+ $(gsfont_h) \
+ $(dict_h) $(dparam_h) $(dstack_h) $(estack_h) $(ilevel_h) $(iname_h) $(store_h)
+
+ ### Filters other than the ones in sfilter.c
+
+ sbits.$(OBJ): sbits.c $(AK) $(stdio__h) $(sbits_h) $(stream_h)
+
+ scftab.$(OBJ): scftab.c $(AK) $(std_h) $(scf_h)
+
+ scfdtab.$(OBJ): scfdtab.c $(AK) $(std_h) $(scf_h)
+
+ scfd.$(OBJ): scfd.c $(AK) $(stdio__h) $(gdebug_h)\
+ $(sbits_h) $(scf_h) $(stream_h)
+
+ scfe.$(OBJ): scfe.c $(AK) $(stdio__h) $(gdebug_h)\
+ $(sbits_h) $(scf_h) $(stream_h)
+
+ sdctd.$(OBJ): sdctd.c $(AK) $(stdio__h) $(gdebug_h) $(stream_h)
+
+ sdcte.$(OBJ): sdcte.c $(AK) $(stdio__h) $(gdebug_h) $(stream_h)
+
+ sfilter2.$(OBJ): sfilter2.c $(AK) $(stdio__h) $(scanchar_h) $(stream_h)
+
+ slzwd.$(OBJ): slzwd.c $(AK) $(stdio__h) $(gdebug_h) $(stream_h)
+
+ slzwe.$(OBJ): slzwe.c $(AK) $(stdio__h) $(gdebug_h) $(stream_h)
+
+ zfilter2.$(OBJ): zfilter2.c $(OP) $(alloc_h) $(dict_h) $(dparam_h) $(sdct_h) $(stream_h)
+
+ # Because of size limits on the DOS command line,
+ # we have to break this up into two parts.
+ filter_1=zfilter2.$(OBJ) sfilter2.$(OBJ) sbits.$(OBJ)
+ filter_2=scfdtab.$(OBJ) scftab.$(OBJ) scfd.$(OBJ) scfe.$(OBJ)
+ filter_3=sdctd.$(OBJ) sdcte.$(OBJ) slzwd.$(OBJ) slzwe.$(OBJ)
+ filter.dev: $(filter_1) $(filter_2) $(filter_3) gssetmod gsaddmod
+ $(SHP)gssetmod filter $(filter_1)
+ $(SHP)gsaddmod filter -obj $(filter_2)
+ $(SHP)gsaddmod filter -obj $(filter_3)
+ $(SHP)gsaddmod filter -oper zfilter2
+
+ ### Precompiled fonts. See fonts.doc for more information.
+
+ CCFONT=$(OP) $(ccfont_h)
+
+ # List the fonts we are going to compile.
+ # Because of intrinsic limitations in `make', we have to list
+ # the object file names and the font names separately.
+ ccfonts1_=uglyr.$(OBJ)
+ ccfonts1=uglyr
+
+ ccfonts.dev: $(MAKEFILE) gs.mak iccfont.$(OBJ) gssetmod gsaddmod \
+ $(ccfonts1_) $(ccfonts2_) $(ccfonts3_) $(ccfonts4_) $(ccfonts5_)
+ $(SHP)gssetmod ccfonts iccfont.$(OBJ)
+ $(SHP)gsaddmod ccfonts -obj $(ccfonts1_)
+ $(SHP)gsaddmod ccfonts -obj $(ccfonts2_)
+ $(SHP)gsaddmod ccfonts -obj $(ccfonts3_)
+ $(SHP)gsaddmod ccfonts -obj $(ccfonts4_)
+ $(SHP)gsaddmod ccfonts -obj $(ccfonts5_)
+ $(SHP)gsaddmod ccfonts -oper ccfonts
+
+ gconfigf.h: $(MAKEFILE) gs.mak genconf$(XE) gssetmod gsaddmod
+ $(SHP)gssetmod ccfonts_
+ $(SHP)gsaddmod ccfonts_ -font $(ccfonts1)
+ $(SHP)gsaddmod ccfonts_ -font $(ccfonts2)
+ $(SHP)gsaddmod ccfonts_ -font $(ccfonts3)
+ $(SHP)gsaddmod ccfonts_ -font $(ccfonts4)
+ $(SHP)gsaddmod ccfonts_ -font $(ccfonts5)
+ $(EXP)genconf ccfonts_.dev -f gconfigf.h
+
+ uglyr.$(OBJ): uglyr.c $(CCFONT)
+ $(CCCF) uglyr.c
+
+ ncrr.$(OBJ): ncrr.c $(CCFONT)
+ $(CCCF) ncrr.c
+
+ pagk.$(OBJ): pagk.c $(CCFONT)
+ $(CCCF) pagk.c
+
+ psyr.$(OBJ): psyr.c $(CCFONT)
+ $(CCCF) psyr.c
+
+ ptmr.$(OBJ): ptmr.c $(CCFONT)
+ $(CCCF) ptmr.c
+
+ pzdr.$(OBJ): pzdr.c $(CCFONT)
+ $(CCCF) pzdr.c
+
+ # ----------------------------- Main program ------------------------------ #
+
+ # Interpreter main program
+
+ gs.$(OBJ): gs.c $(GH) $(ctype__h) \
+ $(gxdevice_h) $(gxdevmem_h) \
+ $(alloc_h) $(errors_h) $(estack_h) $(files_h) $(iscan_h) $(main_h) $(ostack_h) $(store_h) $(stream_h)
+
+ gsmain.$(OBJ): gsmain.c $(GH) \
+ $(gp_h) $(gsmatrix_h) $(gxdevice_h) $(gserrors_h) \
+ $(estack_h) $(files_h) $(iscan_h) $(main_h) $(ostack_h) $(store_h)
+
+ interp.$(OBJ): interp.c $(GH) \
+ $(errors_h) $(estack_h) $(iname_h) $(dict_h) $(dstack_h) $(iscan_h) $(oper_h) $(ostack_h) $(packed_h) $(save_h) $(store_h) $(stream_h)
+ $(CCINT) interp.c
+ # Copyright (C) 1989, 1992, 1993 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.
+
+ # makefile for Ghostscript device drivers.
+
+ # -------------------------------- Catalog ------------------------------- #
+
+ # It is possible to build Ghostscript with an arbitrary collection of
+ # device drivers, although some drivers are supported only on a subset
+ # of the target platforms. The currently available drivers are:
+
+ # Displays:
+ # MS-DOS EGA and VGA:
+ # ega EGA (640x350, 16-color)
+ # vga VGA (640x480, 16-color)
+ # MS-DOS SuperVGA:
+ # + atiw ATI Wonder SuperVGA, 256-color modes
+ # + atiw16 ATI Wonder SuperVGA in 800x600, 16-color mode
+ # s3vga SuperVGA with S3 86C911 chip (e.g., Diamond Stealth board)
+ # tseng SuperVGA using Tseng Labs ET3000/4000 chips, 256-color modes
+ # tseng16 Tseng Labs SuperVGA in 800x600, 16-color mode (256K memory)
+ # + tvga Trident SuperVGA, 256-color modes
+ # + tvga16 Trident SuperVGA in 800x600, 16-color mode (256K memory)
+ # ****** NOTE: The vesa device does not work with the Watcom (32-bit MS-DOS)
+ # ****** compiler or executable.
+ # vesa SuperVGA with VESA standard API driver
+ # MS-DOS other:
+ # bgi Borland Graphics Interface (CGA) [MS-DOS only]
+ # * herc Hercules Graphics display [MS-DOS only]
+ # mswin Microsoft Windows 3.0, 3.1 [MS Windows only]
+ # mswinprn Microsoft Windows 3.0, 3.1 printer [MS Windows only]
+ # * pe Private Eye display
+ # Unix and VMS:
+ # ****** NOTE: For direct frame buffer addressing under SCO Unix or Xenix,
+ # ****** edit the definition of EGAVGA below.
+ # * att3b1 AT&T 3b1/Unixpc monochrome display [3b1 only]
+ # * sonyfb Sony Microsystems monochrome display [Sony only]
+ # * sunview SunView window system [SunOS only]
+ # x11 X Windows version 11, release >=4 [Unix and VMS only]
+ # Printers:
+ # * appledmp Apple Dot Matrix Printer (should also work with Imagewriter)
+ # bj10e Canon BubbleJet BJ10e
+ # * bj200 Canon BubbleJet BJ200
+ # * cdeskjet H-P DeskJet 500C with 1 bit/pixel color
+ # * cdjcolor H-P DeskJet 500C with 24 bit/pixel color and
+ # high-quality color (Floyd-Steinberg) dithering
+ # * cdjmono H-P DeskJet 500C printing black only
+ # * cdj500 H-P DeskJet 500C (same as cdjcolor)
+ # * cdj550 H-P DeskJet 550C
+ # * declj250 alternate DEC LJ250 driver
+ # + deskjet H-P DeskJet and DeskJet Plus
+ # * dfaxhigh DigiBoard, Inc.'s DigiFAX software format (high resolution)
+ # * dfaxlow DigiFAX low (normal) resolution
+ # djet500 H-P DeskJet 500
+ # * djet500c H-P DeskJet 500C
+ # epson Epson-compatible dot matrix printers (9- or 24-pin)
+ # + eps9high Epson-compatible 9-pin, interleaved lines
+ # (triple resolution)
+ # * epsonc Epson LQ-2550 and Fujitsu 3400/2400/1200 color printers
+ # * escp2 Epson ESC/P 2 language printers, including Stylus 800
+ # + ibmpro IBM 9-pin Proprinter
+ # * jetp3852 IBM Jetprinter ink-jet color printer (Model #3852)
+ # + laserjet H-P LaserJet
+ # * la50 DEC LA50 printer
+ # * la75 DEC LA75 printer
+ # * lbp8 Canon LBP-8II laser printer
+ # * ln03 DEC LN03 printer
+ # * lj250 DEC LJ250 Companion color printer
+ # + ljet2p H-P LaserJet IId/IIp/III* with TIFF compression
+ # + ljet3 H-P LaserJet III* with Delta Row compression
+ # + ljet4 H-P LaserJet 4 (defaults to 600 dpi)
+ # + ljetplus H-P LaserJet Plus
+ # * m8510 C.Itoh M8510 printer
+ # * necp6 NEC P6/P6+/P60 printers at 360 x 360 DPI resolution
+ # * nwp533 Sony Microsystems NWP533 laser printer [Sony only]
+ # * oki182 Okidata MicroLine 182
+ # paintjet H-P PaintJet color printer
+ # * pj alternate PaintJet XL driver
+ # * pjxl H-P PaintJet XL color printer
+ # * pjxl300 H-P PaintJet XL300 color printer
+ # * r4081 Ricoh 4081 laser printer
+ # * sparc SPARCprinter
+ # * t4693d2 Tektronix 4693d color printer, 2 bits per R/G/B component
+ # * t4693d4 Tektronix 4693d color printer, 4 bits per R/G/B component
+ # * t4693d8 Tektronix 4693d color printer, 8 bits per R/G/B component
+ # * tek4696 Tektronix 4695/4696 inkjet plotter
+ # * trufax TruFax facsimile driver [Unix only]
+ # File formats and others:
+ # bit A plain "bit bucket" device
+ # bmpmono Monochrome MS Windows .BMP file format
+ # bmp16 4-bit (EGA/VGA) .BMP file format
+ # bmp256 8-bit (256-color) .BMP file format
+ # bmp16m 24-bit .BMP file format
+ # gifmono Monochrome GIF file format
+ # gif8 8-bit color GIF file format
+ # pcxmono Monochrome PCX file format
+ # pcxgray 8-bit gray scale PCX file format
+ # pcx16 Older color PCX file format (EGA/VGA, 16-color)
+ # pcx256 Newer color PCX file format (256-color)
+ # pbm Portable Bitmap (plain format)
+ # pbmraw Portable Bitmap (raw format)
+ # pgm Portable Graymap (plain format)
+ # pgmraw Portable Graymap (raw format)
+ # ppm Portable Pixmap (plain format)
+ # ppmraw Portable Pixmap (raw format)
+ # * tiffg3 TIFF/F (G3 fax)
+
+ # User-contributed drivers marked with * require hardware or software
+ # that is not available to Aladdin Enterprises. Please contact the
+ # original contributors, not Aladdin Enterprises, if you have questions.
+ # Contact information appears in the driver entry below.
+ #
+ # Drivers marked with a + are maintained by Aladdin Enterprises with
+ # the assistance of users, since Aladdin Enterprises doesn't have access to
+ # the hardware for these either.
+
+ # If you add drivers, it would be nice if you kept each list
+ # in alphabetical order.
+
+ # Each platform-specific makefile contains a line of the form
+ # DEVICE_DEVS=<dev1>.dev ... <devn>.dev
+ # where dev1 ... devn are the devices to be included in the build.
+ # You may edit this line to select any desired set of devices.
+ # dev1 will be used as the default device (unless overridden from
+ # the command line with -sDEVICE=xxx, of course.) If you can't fit all the
+ # devices on a single line, you may add lines defining
+ # DEVICE_DEVS2=<dev21>.dev ... <dev2n>.dev
+ # DEVICE_DEVS3=<dev31>.dev ... <dev3n>.dev
+ # etc. up to DEVICE_DEVS9.
+ # Don't use continuation lines, since this may break the MS-DOS command
+ # processor.
+
+ # ---------------------------- End of catalog ---------------------------- #
+
+ # If you want to add a new device driver, the examples below should be
+ # enough of a guide to the correct form for the makefile rules.
+
+ # All device drivers depend on the following:
+ GDEV=$(AK) echogs$(XE) $(gserrors_h) $(gx_h) $(gxdevice_h)
+
+ # Define the header files for device drivers. Every header file used by
+ # more than one device driver must be listed here.
+ gdevpccm_h=gdevpccm.h
+ gdevpcfb_h=gdevpcfb.h $(dos__h)
+ gdevpcl_h=gdevpcl.h
+ gdevsvga_h=gdevsvga.h
+ gdevx_h=gdevx.h
+
+ ###### ------------------- MS-DOS display devices ------------------- ######
+
+ # There are really only three drivers: an EGA/VGA driver (4 bit-planes,
+ # plane-addressed), a SuperVGA driver (8 bit-planes, byte addressed),
+ # and a special driver for the S3 chip.
+ # To make A4 paper the default, change the compilation line from
+ # $(CCD) ...
+ # to
+ # $(CCD) -DA4
+
+ ### ----------------------- EGA and VGA displays ----------------------- ###
+
+ gdevegaa.$(OBJ): gdevegaa.asm
+
+ ETEST=ega.$(OBJ) $(ega_) gdevpcfb.$(OBJ) gdevegaa.$(OBJ)
+ ega.exe: $(ETEST) libc$(MM).tr
+ $(COMPDIR)\tlink $(LCT) $(LO) $(LIBDIR)\c0$(MM) @ega.tr @libc$(MM).tr
+
+ ega.$(OBJ): ega.c $(GDEV)
+ $(CCC) -v ega.c
+
+ # The shared MS-DOS makefile defines PCFBASM as either gdevegaa.$(OBJ)
+ # or an empty string.
+
+ # NOTE: for direct frame buffer addressing under SCO Unix or Xenix,
+ # change gdevevga to gdevsco in the following line.
+ EGAVGA=gdevevga.$(OBJ) gdevpcfb.$(OBJ) $(PCFBASM)
+
+ gdevevga.$(OBJ): gdevevga.c $(GDEV) $(gdevpcfb_h)
+ $(CCD) gdevevga.c
+
+ gdevsco.$(OBJ): gdevsco.c $(GDEV) $(gdevpcfb_h)
+ $(CCD) gdevsco.c
+
+ # Common code for MS-DOS and SCO.
+ gdevpcfb.$(OBJ): gdevpcfb.c $(GDEV) $(MAKEFILE) $(gdevpcfb_h)
+ $(CCD) -DUSE_ASM=0$(USE_ASM) gdevpcfb.c
+
+ # The EGA/VGA family includes: EGA, VGA, and
+ # the ATI Wonder, Tseng ET3000/4000, and Trident SuperVGA in 16-color mode.
+
+ ega.dev: $(EGAVGA) gssetdev
+ $(SHP)gssetdev ega $(EGAVGA)
+
+ vga.dev: $(EGAVGA) gssetdev
+ $(SHP)gssetdev vga $(EGAVGA)
+
+ atiw16.dev: $(EGAVGA) gssetdev
+ $(SHP)gssetdev atiw16 $(EGAVGA)
+
+ tseng16.dev: $(EGAVGA) gssetdev
+ $(SHP)gssetdev tseng16 $(EGAVGA)
+
+ tvga16.dev: $(EGAVGA) gssetdev
+ $(SHP)gssetdev tvga16 $(EGAVGA)
+
+ ### ------------------------- SuperVGA displays ------------------------ ###
+
+ SVGA=gdevsvga.$(OBJ) $(PCFBASM)
+
+ gdevsvga.$(OBJ): gdevsvga.c $(GDEV) $(MAKEFILE) \
+ $(gdevpcfb_h) $(gdevsvga_h)
+ $(CCD) -DUSE_ASM=0$(USE_ASM) gdevsvga.c
+
+ # The SuperVGA family includes: ATI Wonder, S3, Trident, Tseng ET3000/4000,
+ # and VESA.
+
+ atiw.dev: $(SVGA) gssetdev
+ $(SHP)gssetdev atiw $(SVGA)
+
+ tseng.dev: $(SVGA) gssetdev
+ $(SHP)gssetdev tseng $(SVGA)
+
+ tvga.dev: $(SVGA) gssetdev
+ $(SHP)gssetdev tvga $(SVGA)
+
+ vesa.dev: $(SVGA) gssetdev
+ $(SHP)gssetdev vesa $(SVGA)
+
+ # The S3 driver doesn't share much code with the others.
+
+ s3vga_=$(SVGA) gdevs3ga.$(OBJ)
+ s3vga.dev: $(s3vga_) gssetdev
+ $(SHP)gssetdev s3vga $(s3vga_)
+
+ gdevs3ga.$(OBJ): gdevs3ga.c $(GDEV) $(MAKEFILE) $(gdevpcfb_h) $(gdevsvga_h)
+ $(CCD) gdevs3ga.c
+
+ ### ------------ The BGI (Borland Graphics Interface) device ----------- ###
+
+ cgaf.$(OBJ): $(BGIDIR)\cga.bgi
+ $(BGIDIR)\bgiobj /F $(BGIDIR)\cga
+
+ egavgaf.$(OBJ): $(BGIDIR)\egavga.bgi
+ $(BGIDIR)\bgiobj /F $(BGIDIR)\egavga
+
+ # Include egavgaf.$(OBJ) for debugging only.
+ bgi_=gdevbgi.$(OBJ) cgaf.$(OBJ)
+ bgi.dev: $(bgi_) gssetdev gsaddmod
+ $(SHP)gssetdev bgi $(bgi_)
+ $(SHP)gsaddmod bgi -lib $(LIBDIR)\graphics
+
+ gdevbgi.$(OBJ): gdevbgi.c $(GDEV) $(MAKEFILE) $(gxxfont_h)
+ $(CCC) -DBGI_LIB=$(QQ)$(BGIDIRSTR)$(QQ) gdevbgi.c
+
+ ### ------------------- The Hercules Graphics display ------------------- ###
+
+ herc_=gdevherc.$(OBJ)
+ herc.dev: $(herc_) gssetdev
+ $(SHP)gssetdev herc $(herc_)
+
+ gdevherc.$(OBJ): gdevherc.c $(GDEV)
+ $(CCC) gdevherc.c
+
+ ###### ------------------- The Private Eye display ------------------- ######
+ ### Note: this driver was contributed by a user: ###
+ ### please contact narf@media-lab.media.mit.edu if you have questions. ###
+
+ pe_=gdevpe.$(OBJ)
+ pe.dev: $(pe_) gssetdev
+ $(SHP)gssetdev pe $(pe_)
+
+ gdevpe.$(OBJ): gdevpe.c $(GDEV)
+
+ ###### ----------------- The MS-Windows 3.n display ------------------ ######
+
+ gdevmswn_h=gdevmswn.h $(GDEV) gp_mswin.h
+
+ # Choose one of gdevwddb or gdevwdib here.
+ mswin_=gdevmswn.$(OBJ) gdevmsxf.$(OBJ) gdevwdib.$(OBJ) \
+ gdevemap.$(OBJ) gdevpccm.$(OBJ)
+ mswin.dev: $(mswin_) gssetdev
+ $(SHP)gssetdev mswin $(mswin_)
+
+ gdevmswn.$(OBJ): gdevmswn.c $(gdevmswn_h) $(gp_h) $(gpcheck_h) \
+ $(gsprops_h) $(gdevpccm_h)
+
+ gdevmsxf.$(OBJ): gdevmsxf.c $(ctype__h) $(math__h) $(memory__h) \
+ $(gdevmswn_h) $(gsutil_h) $(gxxfont_h)
+
+ # An implementation using a device-dependent bitmap.
+ gdevwddb.$(OBJ): gdevwddb.c $(gdevmswn_h)
+
+ # An implementation using a DIB filled by an image device.
+ gdevwdib.$(OBJ): gdevwdib.c $(dos__h) $(gdevmswn_h)
+
+ ###### ----------------- The MS-Windows 3.n printer ------------------ ######
+
+ mswinprn_=gdevwprn.$(OBJ) gdevmsxf.$(OBJ)
+ mswinprn.dev: $(mswinprn_) gssetdev
+ $(SHP)gssetdev mswinprn $(mswinprn_)
+
+ gdevwprn.$(OBJ): gdevwprn.c $(gdevmswn_h) $(gp_h) $(gpcheck_h) \
+ $(gsprops_h) $(gdevpccm_h)
+
+ ### ---------------- Amiga display/printer/file devices ---------------- ###
+ ### Note: this driver was contributed by a user: please contact ###
+ ### Olaf Barthel (olsen@sourcery.han.de) if you have questions. ###
+ ### He would also like to hear from anyone using the driver. ###
+ ### Please consult the source code for additional documentation. ###
+
+ amiga_=gdevamiga.$(OBJ)
+
+ amiga.dev: $(amiga_) gssetdev
+ $(SHP)gssetdev amiga $(amiga_)
+
+ amiga_low.dev: $(amiga_) gssetdev
+ $(SHP)gssetdev amiga_low $(amiga_)
+
+ amiga_high.dev: $(amiga_) gssetdev
+ $(SHP)gssetdev amiga_high $(amiga_)
+
+ amiga_super.dev: $(amiga_) gssetdev
+ $(SHP)gssetdev amiga_super $(amiga_)
+
+ amiga_a2024.dev: $(amiga_) gssetdev
+ $(SHP)gssetdev amiga_a2024 $(amiga_)
+
+ amiga_picassoii.dev: $(amiga_) gssetdev
+ $(SHP)gssetdev amiga_picassoii $(amiga_)
+
+ amiga_custom.dev: $(amiga_) gssetdev
+ $(SHP)gssetdev amiga_custom $(amiga_)
+
+ amiga_printer.dev: $(amiga_) gssetdev
+ $(SHP)gssetdev amiga_printer $(amiga_)
+
+ amiga_ilbm.dev: $(amiga_) gssetdev
+ $(SHP)gssetdev amiga_ilbm $(amiga_)
+
+ gdevamiga.$(OBJ): gdevamiga.c $(GDEV) $(arch_h)
+
+ ###### ----------- The AT&T 3b1 Unixpc monochrome display ------------ ######
+ ### Note: this driver was contributed by a user: please contact ###
+ ### Andy Fyfe (andy@cs.caltech.edu) if you have questions. ###
+
+ att3b1_=gdev3b1.$(OBJ)
+ att3b1.dev: $(att3b1_) gssetdev
+ $(SHP)gssetdev att3b1 $(att3b1_)
+
+ gdev3b1.$(OBJ): gdev3b1.c
+
+ ###### --------------- Memory-buffered printer devices --------------- ######
+
+ # The dependency list for printers includes devs.mak because
+ # you can specify -DA4 to make A4 paper the default.
+ # See below under, e.g., gdevdjet.c.
+ PDEVH=$(GDEV) $(gdevprn_h) devs.mak
+
+ gdevprn.$(OBJ): gdevprn.c $(PDEVH) $(gp_h) $(gsprops_h)
+
+ ### ------------------- The Apple DMP printer device ------------------- ###
+
+ appledmp_=gdevadmp.$(OBJ) gdevprn.$(OBJ)
+
+ appledmp.dev: $(appledmp_) gssetdev
+ $(SHP)gssetdev appledmp $(appledmp_)
+
+ ### ------------ The Canon BubbleJet BJ10e and BJ200 devices ------------ ###
+
+ bj10e_=gdevbj10.$(OBJ) gdevprn.$(OBJ)
+
+ bj10e.dev: $(bj10e_) gssetdev
+ $(SHP)gssetdev bj10e $(bj10e_)
+
+ bj200.dev: $(bj10e_) gssetdev
+ $(SHP)gssetdev bj200 $(bj10e_)
+
+ gdevbj10.$(OBJ): gdevbj10.c $(PDEVH)
+
+ ### -------------------------- The DigiFAX device ----------------------- ###
+ ### This driver outputs images in a format suitable for use with ###
+ ### DigiBoard, Inc.'s DigiFAX software. Use -sDEVICE=dfaxhigh for ###
+ ### high resolution output, -sDEVICE=dfaxlow for normal output. ###
+ ### Note: this driver was contributed by a user: please contact ###
+ ### Rick Richardson (rick@digibd.com) if you have questions. ###
+
+ digifax_=gdevdfax.$(OBJ) gdevprn.$(OBJ)
+ dfaxhigh.dev: $(digifax_) gssetdev
+ $(SHP)gssetdev dfaxhigh $(digifax_)
+
+ dfaxlow.dev: $(digifax_) gssetdev
+ $(SHP)gssetdev dfaxlow $(digifax_)
+
+ gdevdfax.$(OBJ): gdevdfax.c $(GDEV) $(gdevprn_h) gdevdfg3.h
+
+ ### ----------- The H-P DeskJet and LaserJet printer devices ----------- ###
+
+ ### These are essentially the same device.
+ ### You can make A4 paper the default: see below.
+ ### NOTE: printing at full resolution (300 DPI) requires a printer
+ ### with at least 1.5 Mb of memory. 150 DPI only requires .5 Mb.
+
+ HPPCL=gdevprn.$(OBJ) gdevpcl.$(OBJ)
+ HPMONO=gdevdjet.$(OBJ) $(HPPCL)
+
+ gdevpcl.$(OBJ): gdevpcl.c $(PDEVH) $(gdevpcl_h)
+
+ # To make A4 paper the default, change the second line below this to
+ # $(CCC) -DA4 gdevdjet.c
+ gdevdjet.$(OBJ): gdevdjet.c $(PDEVH) $(gdevpcl_h)
+ $(CCC) gdevdjet.c
+
+ deskjet.dev: $(HPMONO) gssetdev
+ $(SHP)gssetdev deskjet $(HPMONO)
+
+ djet500.dev: $(HPMONO) gssetdev
+ $(SHP)gssetdev djet500 $(HPMONO)
+
+ laserjet.dev: $(HPMONO) gssetdev
+ $(SHP)gssetdev laserjet $(HPMONO)
+
+ ljetplus.dev: $(HPMONO) gssetdev
+ $(SHP)gssetdev ljetplus $(HPMONO)
+
+ ### Selecting ljet2p provides TIFF (mode 2) compression on LaserJet III,
+ ### IIIp, IIId, IIIsi, IId, and IIp.
+
+ ljet2p.dev: $(HPMONO) gssetdev
+ $(SHP)gssetdev ljet2p $(HPMONO)
+
+ ### Selecting ljet3 provides Delta Row (mode 3) compression on LaserJet III,
+ ### IIIp, IIId, IIIsi.
+
+ ljet3.dev: $(HPMONO) gssetdev
+ $(SHP)gssetdev ljet3 $(HPMONO)
+
+ ### Selecting ljet4 also provides Delta Row compression on LaserJet IV series.
+
+ ljet4.dev: $(HPMONO) gssetdev
+ $(SHP)gssetdev ljet4 $(HPMONO)
+
+ ###- The H-P DeskJet 500C/550C and PaintJet family color printer devices -###
+ ### Note: there are two different 500C drivers, both contributed by users.###
+ ### If you have questions about the djet500c driver, ###
+ ### please contact AKayser@et.tudelft.nl. ###
+ ### If you have questions about the cdj* drivers, ###
+ ### please contact g.cameron@biomed.abdn.ac.uk. ###
+
+ cdeskjet_=gdevcdj.$(OBJ) $(HPPCL)
+
+ cdeskjet.dev: $(cdeskjet_) gssetdev
+ $(SHP)gssetdev cdeskjet $(cdeskjet_)
+
+ cdjcolor.dev: $(cdeskjet_) gssetdev
+ $(SHP)gssetdev cdjcolor $(cdeskjet_)
+
+ cdjmono.dev: $(cdeskjet_) gssetdev
+ $(SHP)gssetdev cdjmono $(cdeskjet_)
+
+ cdj500.dev: $(cdeskjet_) gssetdev
+ $(SHP)gssetdev cdj500 $(cdeskjet_)
+
+ cdj550.dev: $(cdeskjet_) gssetdev
+ $(SHP)gssetdev cdj550 $(cdeskjet_)
+
+ declj250.dev: $(cdeskjet_) gssetdev
+ $(SHP)gssetdev declj250 $(cdeskjet_)
+
+ pj.dev: $(cdeskjet_) gssetdev
+ $(SHP)gssetdev pj $(cdeskjet_)
+
+ pjxl.dev: $(cdeskjet_) gssetdev
+ $(SHP)gssetdev pjxl $(cdeskjet_)
+
+ pjxl300.dev: $(cdeskjet_) gssetdev
+ $(SHP)gssetdev pjxl300 $(cdeskjet_)
+
+ # NB: you can also customise the build if required, using -DA4 (for A4 paper)
+ # and -DBitsPerPixel=<number> if you wish the default to be other than 24
+ # for the generic drivers (cdj500, cdj550, pjxl300, pjtest, pjxltest).
+ # E.g,. to make A4 paper the default, change the second line below this to
+ # $(CCC) -DA4 gdevdjet.c
+ gdevcdj.$(OBJ): gdevcdj.c $(PDEVH) $(gdevpcl_h)
+ $(CCC) gdevcdj.c
+
+ djet500c_=gdevdjtc.$(OBJ) $(HPPCL)
+ djet500c.dev: $(djet500c_) gssetdev
+ $(SHP)gssetdev djet500c $(djet500c_)
+
+ gdevdjtc.$(OBJ): gdevdjtc.c $(PDEVH) $(gdevpcl_h)
+
+ ### ----------------- The generic Epson printer device ----------------- ###
+
+ epson_=gdevepsn.$(OBJ) gdevprn.$(OBJ)
+
+ epson.dev: $(epson_) gssetdev
+ $(SHP)gssetdev epson $(epson_)
+
+ eps9high.dev: $(epson_) gssetdev
+ $(SHP)gssetdev eps9high $(epson_)
+
+ gdevepsn.$(OBJ): gdevepsn.c $(PDEVH)
+
+ ### ----------------- The IBM Proprinter printer device ---------------- ###
+
+ ibmpro.dev: $(epson_) gssetdev
+ $(SHP)gssetdev ibmpro $(epson_)
+
+ ### -------------- The Epson LQ-2550 color printer device -------------- ###
+ ### Note: this driver was contributed by users: please contact ###
+ ### Dave St. Clair (dave@exlog.com) if you have questions. ###
+
+ epsonc_=gdevepsc.$(OBJ) gdevprn.$(OBJ)
+ epsonc.dev: $(epsonc_) gssetdev
+ $(SHP)gssetdev epsonc $(epsonc_)
+
+ gdevepsc.$(OBJ): gdevepsc.c $(PDEVH)
+
+ ### -------------- The Epson ESC/P 2 language printer device ----------- ###
+ ### Note: this driver was contributed by a user: if you have questions, ###
+ ### please contact Richard Brown (rab@tauon.ph.unimelb.edu.au). ###
+
+ escp2_=gdevescp.$(OBJ) gdevprn.$(OBJ)
+ escp2.dev: $(escp2_) gssetdev
+ $(SHP)gssetdev escp2 $(escp2_)
+
+ gdevescp.$(OBJ): gdevescp.c $(PDEVH)
+
+ ### ------------ The H-P PaintJet color printer device ----------------- ###
+ ### Note: this driver also supports the DEC LJ250 color printer, which ###
+ ### has a PaintJet-compatible mode, and the PaintJet XL. ###
+ ### If you have questions about the XL, please contact Rob Reiss ###
+ ### (rob@moray.berkeley.edu). ###
+
+ PJET=gdevpjet.$(OBJ) $(HPPCL)
+
+ gdevpjet.$(OBJ): gdevpjet.c $(PDEVH) $(gdevpcl_h)
+
+ lj250.dev: $(PJET) gssetdev
+ $(SHP)gssetdev lj250 $(PJET)
+
+ paintjet.dev: $(PJET) gssetdev
+ $(SHP)gssetdev paintjet $(PJET)
+
+ pjetxl.dev: $(PJET) gssetdev
+ $(SHP)gssetdev pjetxl $(PJET)
+
+ ### ------- The IBM 3852 JetPrinter color inkjet printer device -------- ###
+ ### Note: this driver was contributed by users: please contact ###
+ ### Kevin Gift (kgift@draper.com) if you have questions. ###
+ ### Note that the paper size that can be addressed by the graphics mode ###
+ ### used in this driver is fixed at 7-1/2 inches wide (the printable ###
+ ### width of the jetprinter itself.) ###
+
+ jetp3852_=gdev3852.$(OBJ) gdevprn.$(OBJ)
+ jetp3852.dev: $(jetp3852_) gssetdev
+ $(SHP)gssetdev jetp3852 $(jetp3852_)
+
+ gdevjetp.$(OBJ): gdevjetp.c $(PDEVH) $(gdevpcl_h)
+
+ ### ----------------- The Canon LBP-8II printer device ----------------- ###
+ ### Note: this driver was contributed by users: please contact ###
+ ### Tom Quinn (trq@prg.oxford.ac.uk) if you have questions. ###
+ ### Note that the standard paper size for this driver is the European ###
+ ### A4 size, not the American 8.5" x 11" size. ###
+
+ lbp8_=gdevlbp8.$(OBJ) gdevprn.$(OBJ)
+ lbp8.dev: $(lbp8_) gssetdev
+ $(SHP)gssetdev lbp8 $(lbp8_)
+
+ gdevlbp8.$(OBJ): gdevlbp8.c $(PDEVH)
+
+ ### -------------- The DEC LN03/LA50/LA75 printer devices -------------- ###
+ ### Note: this driver was contributed by users: please contact ###
+ ### Ulrich Mueller (ulm@vsnhd1.cern.ch) if you have questions. ###
+ ### For questions about LA50 and LA75: please contact ###
+ ### Ian MacPhedran (macphed@dvinci.USask.CA). ###
+ ### For the LN03, you can make A4 paper the default: see below. ###
+
+ ln03_=gdevln03.$(OBJ) gdevprn.$(OBJ)
+ ln03.dev: $(ln03_) gssetdev
+ $(SHP)gssetdev ln03 $(ln03_)
+
+ la50.dev: $(ln03_) gssetdev
+ $(SHP)gssetdev la50 $(ln03_)
+
+ la75.dev: $(ln03_) gssetdev
+ $(SHP)gssetdev la75 $(ln03_)
+
+ # To make A4 paper the default, change the second line below this to
+ # $(CCC) -DA4 gdevln03.c
+ gdevln03.$(OBJ): gdevln03.c $(PDEVH)
+ $(CCC) gdevln03.c
+
+ ### -------------- The C.Itoh M8510 printer device --------------------- ###
+ ### Note: this driver was contributed by a user: please contact Bob ###
+ ### Smith <bob@snuffy.penfield.ny.us> if you have questions. ###
+
+ m8510_=gdev8510.$(OBJ) gdevprn.$(OBJ)
+ m8510.dev: $(m8510_) gssetdev
+ $(SHP)gssetdev m8510 $(m8510_)
+
+ gdev8510.$(OBJ): gdev8510.c $(PDEVH)
+
+ ### --------------------- The NEC P6 family devices -------------------- ###
+
+ necp6_=gdevnp6.$(OBJ) gdevprn.$(OBJ)
+ necp6.dev: $(necp6_) gssetdev
+ $(SHP)gssetdev necp6 $(necp6_)
+
+ gdevnp6.$(OBJ): gdevnp6.c $(PDEVH)
+
+ ### ----------------- The Okidata MicroLine 182 device ----------------- ###
+ ### Note: this driver was contributed by a user: please contact ###
+ ### Maarten Koning (smeg@bnr.ca) if you have questions. ###
+
+ oki182_=gdevo182.$(OBJ) gdevprn.$(OBJ)
+ oki182.dev: $(oki182_) gssetdev
+ $(SHP)gssetdev oki182 $(oki182_)
+
+ gdevo182.$(OBJ): gdevo182.c $(PDEVH)
+
+ ### ------------- The Ricoh 4081 laser printer device ------------------ ###
+ ### Note: this driver was contributed by users: ###
+ ### please contact kdw@oasis.icl.co.uk if you have questions. ###
+
+ r4081_=gdev4081.$(OBJ) gdevprn.$(OBJ)
+ r4081.dev: $(r4081_) gssetdev
+ $(SHP)gssetdev r4081 $(r4081_)
+
+ gdev4081.$(OBJ): gdev4081.c $(PDEVH)
+
+ ###### ------------------------ Sony devices ------------------------ ######
+ ### Note: these drivers were contributed by users: please contact ###
+ ### Mike Smolenski (mike@intertech.com) if you have questions. ###
+
+ ### ------------------- Sony NeWS frame buffer device ------------------ ###
+
+ sonyfb_=gdevsnfb.$(OBJ) gdevprn.$(OBJ)
+ sonyfb.dev: $(sonyfb_) gssetdev
+ $(SHP)gssetdev sonyfb $(sonyfb_)
+
+ gdevsnfb.$(OBJ): gdevsnfb.c $(PDEVH)
+
+ ### -------------------- Sony NWP533 printer device -------------------- ###
+ ### Note: this driver was contributed by a user: please contact Tero ###
+ ### Kivinen (kivinen@joker.cs.hut.fi) if you have questions. ###
+
+ nwp533_=gdevn533.$(OBJ) gdevprn.$(OBJ)
+ nwp533.dev: $(nwp533_) gssetdev
+ $(SHP)gssetdev nwp533 $(nwp533_)
+
+ gdevn533.$(OBJ): gdevn533.c $(PDEVH)
+
+ ### ------------------------- The SPARCprinter ------------------------- ###
+ ### Note: this driver was contributed by users: please contact Martin ###
+ ### Schulte (schulte@thp.uni-koeln.de) if you have questions. ###
+ ### He would also like to hear from anyone using the driver. ###
+ ### Please consult the source code for additional documentation. ###
+
+ sparc_=gdevsppr.$(OBJ) gdevprn.$(OBJ)
+ sparc.dev: $(sparc_) gssetdev
+ $(SHP)gssetdev sparc $(sparc_)
+
+ gdevsppr.$(OBJ): gdevsppr.c $(PDEVH)
+
+ ###### --------------------- The SunView device --------------------- ######
+ ### Note: this driver is maintained by a user: if you have questions, ###
+ ### please contact Andreas Stolcke (stolcke@icsi.berkeley.edu). ###
+
+ sunview_=gdevsun.$(OBJ)
+ sunview.dev: $(sunview_) gssetdev gsaddmod
+ $(SHP)gssetdev sunview $(sunview_)
+ $(SHP)gsaddmod sunview -lib suntool sunwindow pixrect
+
+ gdevsun.$(OBJ): gdevsun.c $(GDEV) $(arch_h)
+
+ ### ----------------- Tektronix 4396d color printer -------------------- ###
+ ### Note: this driver was contributed by a user: please contact ###
+ ### Karl Hakimian (hakimian@haney.eecs.wsu.edu) ###
+ ### if you have questions. ###
+
+ t4693d_=gdev4693.$(OBJ) gdevprn.$(OBJ)
+ t4693d2.dev: $(t4693d_) gssetdev
+ $(SHP)gssetdev t4693d2 $(t4693d_)
+
+ t4693d4.dev: $(t4693d_) gssetdev
+ $(SHP)gssetdev t4693d4 $(t4693d_)
+
+ t4693d8.dev: $(t4693d_) gssetdev
+ $(SHP)gssetdev t4693d8 $(t4693d_)
+
+ gdev4693.$(OBJ): gdev4693.c $(GDEV)
+
+ ### -------------------- Tektronix ink-jet printers -------------------- ###
+ ### Note: this driver was contributed by a user: please contact ###
+ ### Karsten Spang (spang@nbivax.nbi.dk) if you have questions. ###
+
+ tek4696_=gdevtknk.$(OBJ) gdevprn.$(OBJ)
+ tek4696.dev: $(tek4696_) gssetdev
+ $(SHP)gssetdev tek4696 $(tek4696_)
+
+ gdevtknk.$(OBJ): gdevtknk.c $(PDEVH)
+
+ ### ----------------- The TruFax facsimile device ---------------------- ###
+ ### Note: this driver was contributed by users: please contact ###
+ ### Neil Ostroff (nao@maestro.bellcore.com) if you have questions. ###
+ ### Note that the driver requires a file encode_l.o supplied by the ###
+ ### makers of the TruFax product. ###
+
+ trufax_=gdevtrfx.$(OBJ) gdevprn.$(OBJ) encode_l.$(OBJ)
+ trufax.dev: $(trufax_) gssetdev
+ $(SHP)gssetdev trufax $(trufax_)
+
+ gdevtrfx.$(OBJ): gdevtrfx.c $(GDEV)
+
+ ###### ----------------------- The X11 device ----------------------- ######
+
+ # Aladdin Enterprises does not support Ghostview. For more information
+ # about Ghostview, please contact Tim Theisen (ghostview@cs.wisc.edu).
+
+ x11_=gdevx.$(OBJ) gdevxini.$(OBJ) gdevxxf.$(OBJ) gdevemap.$(OBJ)
+ x11.dev: $(x11_) gssetdev gsaddmod
+ $(SHP)gssetdev x11 $(x11_)
+ $(SHP)gsaddmod x11 -lib Xt X11 Xext
+
+ # See the main makefile for the definition of XINCLUDE.
+ GDEVX=$(GDEV) x_.h gdevx.h $(MAKEFILE)
+ gdevx.$(OBJ): gdevx.c $(GDEVX) $(gsprops_h) $(gsutil_h)
+ $(CCC) $(XINCLUDE) gdevx.c
+
+ gdevxini.$(OBJ): gdevxini.c $(GDEVX) $(ctype__h)
+ $(CCC) $(XINCLUDE) gdevxini.c
+
+ gdevxxf.$(OBJ): gdevxxf.c $(GDEVX) $(gsutil_h) $(gxxfont_h)
+ $(CCC) $(XINCLUDE) gdevxxf.c
+
+ ### ---------------------- The bit bucket device ----------------------- ###
+
+ bit_=gdevbit.$(OBJ) gdevprn.$(OBJ)
+ bit.dev: $(bit_) gssetdev
+ $(SHP)gssetdev bit $(bit_)
+
+ gdevbit.$(OBJ): gdevbit.c $(PDEVH)
+
+ ###### ----------------------- PC file formats ---------------------- ######
+
+ gdevpccm.$(OBJ): gdevpccm.c $(AK) \
+ $(gs_h) $(gsmatrix_h) $(gxdevice_h) $(gdevpccm_h)
+
+ ### ------------------------- .BMP file formats ------------------------- ###
+
+ bmp_=gdevbmp.$(OBJ) gdevpccm.$(OBJ) gdevprn.$(OBJ)
+
+ gdevbmp.$(OBJ): gdevbmp.c $(PDEVH) $(gdevpccm_h)
+
+ bmpmono.dev: $(bmp_) gssetdev
+ $(SHP)gssetdev bmpmono $(bmp_)
+
+ bmp16.dev: $(bmp_) gssetdev
+ $(SHP)gssetdev bmp16 $(bmp_)
+
+ bmp256.dev: $(bmp_) gssetdev
+ $(SHP)gssetdev bmp256 $(bmp_)
+
+ bmp16m.dev: $(bmp_) gssetdev
+ $(SHP)gssetdev bmp16m $(bmp_)
+
+ ### ------------------------- GIF file formats ------------------------- ###
+
+ GIF=gdevgif.$(OBJ) gdevpccm.$(OBJ) gdevprn.$(OBJ)
+
+ gdevgif.$(OBJ): gdevgif.c $(PDEVH) $(gdevpccm_h)
+
+ gifmono.dev: $(GIF) gssetdev
+ $(SHP)gssetdev gifmono $(GIF)
+
+ gif8.dev: $(GIF) gssetdev
+ $(SHP)gssetdev gif8 $(GIF)
+
+ ### ------------------------- PCX file formats ------------------------- ###
+
+ pcx_=gdevpcx.$(OBJ) gdevpccm.$(OBJ) gdevprn.$(OBJ)
+
+ gdevpcx.$(OBJ): gdevpcx.c $(PDEVH) $(gdevpccm_h) $(gxlum_h)
+
+ pcxmono.dev: $(pcx_) gssetdev
+ $(SHP)gssetdev pcxmono $(pcx_)
+
+ pcxgray.dev: $(pcx_) gssetdev
+ $(SHP)gssetdev pcxgray $(pcx_)
+
+ pcx16.dev: $(pcx_) gssetdev
+ $(SHP)gssetdev pcx16 $(pcx_)
+
+ pcx256.dev: $(pcx_) gssetdev
+ $(SHP)gssetdev pcx256 $(pcx_)
+
+ ###### ------------------- Portable Bitmap devices ------------------ ######
+ ### For more information, see the pbm(5), pgm(5), and ppm(5) man pages. ###
+
+ pxm_=gdevpbm.$(OBJ) gdevprn.$(OBJ)
+
+ gdevpbm.$(OBJ): gdevpbm.c $(PDEVH) $(gxlum_h)
+
+ ### Portable Bitmap (PBM, plain or raw format, magic numbers "P1" or "P4")
+
+ pbm.dev: $(pxm_) gssetdev
+ $(SHP)gssetdev pbm $(pxm_)
+
+ pbmraw.dev: $(pxm_) gssetdev
+ $(SHP)gssetdev pbmraw $(pxm_)
+
+ ### Portable Graymap (PGM, plain or raw format, magic numbers "P2" or "P5")
+
+ pgm.dev: $(pxm_) gssetdev
+ $(SHP)gssetdev pgm $(pxm_)
+
+ pgmraw.dev: $(pxm_) gssetdev
+ $(SHP)gssetdev pgmraw $(pxm_)
+
+ ### Portable Pixmap (PPM, plain or raw format, magic numbers "P3" or "P6")
+
+ ppm.dev: $(pxm_) gssetdev
+ $(SHP)gssetdev ppm $(pxm_)
+
+ ppmraw.dev: $(pxm_) gssetdev
+ $(SHP)gssetdev ppmraw $(pxm_)
+
+ ### -------------------------- TIFF/F device ---------------------------- ###
+ ### This driver outputs images in a TIFF format ###
+ ### Use -sDEVICE=tiffg3 and ###
+ ### -r204x98 for low resolution output, or ###
+ ### -r204x196 for high resolution output ###
+ ### Note also that 3 page sizes are understood: letter, A4, and B4 ###
+ ### Note: this driver was contributed by a user: please contact ###
+ ### Sam Leffler (sam@sgi.com) if you have questions. ###
+
+ tiffg3_=gdevtiff.$(OBJ) gdevprn.$(OBJ)
+ tiffg3.dev: $(tiffg3_) gssetdev
+ $(SHP)gssetdev tiffg3 $(tiffg3_)
+ gdevtiff.$(OBJ): gdevtiff.c $(GDEV) $(gdevprn_h) gdevdfg3.h gdevtiff.h
+ # Copyright (C) 1990, 1992, 1993 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.
+
+ # Partial makefile for Ghostscript, common to all Unix configurations.
+
+ # This is the last part of the makefile for Unix configurations.
+ # Since Unix make doesn't have an 'include' facility, we concatenate
+ # the various parts of the makefile together by brute force (in tar_cat).
+
+ # The following prevents GNU make from constructing argument lists that
+ # include all environment variables, which can easily be longer than
+ # brain-damaged system V allows.
+
+ .NOEXPORT:
+
+ # -------------------------------- Library -------------------------------- #
+
+ ## The Commodore Amiga
+
+ amiga__=gp_nofb.$(OBJ) gp_amiga.$(OBJ) gdevpipe.$(OBJ)
+ amiga_.dev: $(amiga__) gssetmod gsaddmod
+ $(SHP)gssetmod amiga_ $(amiga__)
+ $(SHP)gsaddmod amiga_ -fdev pipe
+
+ gp_amiga.$(OBJ): gp_amiga.c $(AK) $(memory__h) $(string__h) $(gx_h) $(gp_h) \
+
+ ## The Unix platforms
+
+ # We have to include a test for the existence of sys/time.h,
+ # because some System V platforms don't have it.
+
+ # All reasonable Unix platforms.
+ unix__=gp_nofb.$(OBJ) gp_unix.$(OBJ) gdevpipe.$(OBJ)
+ unix_.dev: $(unix__) gssetmod gsaddmod
+ $(SHP)gssetmod unix_ $(unix__)
+ $(SHP)gsaddmod unix_ -fdev pipe
+
+ gp_unix.$(OBJ): gp_unix.c $(AK) $(memory__h) $(string__h) $(gx_h) $(gp_h) \
+ $(gsutil_h) $(stat__h) $(time__h)
+ if ( test -f /gnu/include/sys/time.h ) then $(CCC) gp_unix.c;\
+ else $(CCC) -DNOSYSTIME gp_unix.c; fi
+
+ gdevpipe.$(OBJ): gdevpipe.c $(AK) $(stdio__h) $(gstypes_h) \
+ $(filedev_h) $(stream_h)
+
+ # Brain-damaged System V platforms.
+ sysv__=gp_nofb.$(OBJ) gp_unix.$(OBJ) gp_sysv.$(OBJ)
+ sysv_.dev: $(sysv__) gssetmod
+ $(SHP)gssetmod sysv_ $(sysv__)
+
+ gp_sysv.$(OBJ): gp_sysv.c $(time__h) $(AK)
+ if ( test -f /gnu/include/sys/time.h ) then $(CCC) gp_sysv.c;\
+ else $(CCC) -DNOSYSTIME gp_sysv.c; fi
+
+ # -------------------------- Auxiliary programs --------------------------- #
+
+ ansi2knr$(XE): ansi2knr.c $(stdio__h) $(string__h) $(malloc__h)
+ $(CC) -o ansi2knr$(XE) $(CFLAGS) ansi2knr.c
+
+ echogs$(XE): echogs.c
+ $(CC) -o echogs$(XE) $(CFLAGS) echogs.c
+
+ # On the RS/6000 (at least), compiling genarch.c with gcc with -O
+ # produces a buggy executable.
+ genarch$(XE): genarch.c
+ $(CC) -o genarch$(XE) genarch.c
+
+ genconf$(XE): genconf.c
+ $(CC) -o genconf$(XE) genconf.c
+
+ # ----------------------------- Main program ------------------------------ #
+
+ BEGINFILES=
+ CCBEGIN=$(CCC) *.c
+
+ # Interpreter main program
+
+ GSAMIGA=gs.$(OBJ) gsmain.$(OBJ) $(INT) $(LIBGS)
+
+ # The second call on echogs writes a \. This is the only
+ # way to do it that works with all flavors of shell!
+ $(GS)$(XE): $(GSAMIGA) ld.tr echogs $(ALL_DEVS)
+ ./echogs -n - $(CC) $(LDFLAGS) $(XLIBDIRS) -o gs $(GSAMIGA) >_temp_
+ ./echogs -x 205c >>_temp_
+ cat ld.tr >>_temp_
+ ./echogs - $(EXTRALIBS) -lm >>_temp_
+ $(SH) <_temp_
+
+ # Installation
+
+ TAGS:
+ etags -t *.c *.h
+
+ docdir=$(gsdatadir)/doc
+ exdir=$(gsdatadir)/examples
+
+ install: $(GS)
+ if [ -d $(bindir) ]; then true; else mkdir $(bindir); fi
+ if [ -d $(datadir) ]; then true; else mkdir $(datadir); fi
+ if [ -d $(gsdatadir) ]; then true; else mkdir $(gsdatadir); fi
+ if [ -d $(gsdatadir)/fonts ]; then true; else mkdir $(gsdatadir)/fonts; fi
+ if [ -d $(docdir) ]; then true; else mkdir $(docdir); fi
+ if [ -d $(exdir) ]; then true; else mkdir $(exdir); fi
+ for f in $(GS) gsbj gsdj gslj gslp gsnd bdftops font2c ps2ascii ps2epsi ; do $(INSTALL_PROGRAM) $$f $(bindir)/$$f ; done
+ for f in README gslp.ps gs_init.ps gs_dps1.ps gs_fonts.ps gs_lev2.ps gs_statd.ps gs_type0.ps gs_dbt_e.ps gs_sym_e.ps quit.ps Fontmap uglyr.gsf bdftops.ps decrypt.ps font2c.ps impath.ps landscap.ps level1.ps prfont.ps ps2ascii.ps ps2epsi.ps ps2image.ps pstoppm.ps showpage.ps type1ops.ps wrfont.ps ; do $(INSTALL_DATA) $$f $(gsdatadir)/$$f ; done
+ for f in NEWS ansi2knr.1 devices.doc drivers.doc fonts.doc gs.1 hershey.doc history.doc humor.doc language.doc lib.doc make.doc ps2epsi.doc psfiles.doc readme.doc use.doc xfonts.doc ; do $(INSTALL_DATA) $$f $(docdir)/$$f ; done
+ for f in chess.ps cheq.ps colorcir.ps golfer.ps escher.ps snowflak.ps tiger.ps ; do $(INSTALL_DATA) $$f $(exdir)/$$f ; done
diff -rc --new-file ghostscript-2.6.1-fsf/amiga.doc ghostscript-2.6.1-amiga/amiga.doc
*** ghostscript-2.6.1-fsf/amiga.doc Thu Jan 1 00:00:00 1970
--- ghostscript-2.6.1-amiga/amiga.doc Wed Feb 2 13:38:30 1994
***************
*** 0 ****
--- 1,318 ----
+ GNU Ghostscript 2.6.1 Amiga port, revised 29 January 1994
+ =========================================================
+ This port requires:
+
+ - An Amiga equipped with an '020 CPU or any successor CPU model and and
+ Kickstart 2.04 or higher.
+
+ - Approx. 4.7 MBytes of hard disk space available.
+
+ - A minimum of 1 MByte of chip memory, depending on what you will want to
+ do with the interpreter. Printer output requires at least 2 MBytes of
+ contiguous memory (any memory, not necessarily chip memory).
+
+ - ixemul.library and a bunch of Postscript/Ghostscript fonts.
+
+
+ New features in the revised v2.6.1 release
+ ------------------------------------------
+ By public request I have recompiled the program to use the built-in math
+ library, so you no longer need an FPU to run the program. I also took a
+ closer look at the code which tries to determine the printer page
+ resolution: you will no longer have trouble with printers featuring
+ built-in paper tractors. I tried all printer drivers to be found on the
+ Workbench disk to make sure the printer support code really works. Good
+ luck! Some small bugs were ironed out and I also took the time to add
+ support for another two display drivers (the Picasso II driver which
+ requires the Picasso monitor driver v2.14 to work correctly and the
+ `custom' driver which requires asl.library v38 to be installed). The entire
+ program was recompiled using GCC 2.4.5.
+
+
+ New Amiga features in release v2.6.1
+ ------------------------------------
+ The v2.6.0 port used to implement only monochrome drivers, the v2.6.1 port
+ supports colour output on most devices, exceptions where noted. You don't
+ need a special brand of graphics hardware expansion, colour output will
+ work on any Amiga model, provided there is enough memory available. All
+ devices capable of doing colour output will reduce the number of colours to
+ be displayed if in dire need of memory. As for the display oriented devices
+ this will go mostly unnoticed as the Ghostscript halftoning algorithms will
+ compensate for any colour reductions. However, printer output quality is
+ very likely to suffer from colour reduction. So, watch out!
+ As the display oriented devices start up in colour output mode, black &
+ white rendering may be slightly slowed. The printer device is configured
+ according to the Preferences settings; `Black & white' will result in
+ monochrome output, `Grayscale 1' and `Grayscale 2' will also produce
+ monochrome output but will internally use a true colour representation of
+ the page, so does `Color'. Please note that `true colour' refers to the
+ Amiga 12 bit colour model, at this time of writing 24 bit colour printing
+ is not yet implemented.
+ The default output device (a super-bitmap window to opened on the
+ default public screen, such as Workbench) will take advantage of the
+ Kickstart 3.0 pen sharing feature if enough colours (eight or more)
+ are available.
+
+ The v2.6.0 port used to rely on printer drivers to initialize their maximum
+ page size information upon startup. Several users reported problems with
+ certain drivers which would make this information available only after
+ having been asked to do so. The v2.6.1 port now follows the programmers'
+ guidelines how to determine the maximum page size closely. The driver may
+ still complain if configured for `Grayscale 1', `Grayscale 2' or `Color'
+ output and there is not enough memory available for the page to be
+ displayed.
+
+
+ Installation
+ ------------
+ Enter the command line interpreter, Create a directory on your hard disk
+ drive, label it "ghostscript". Let's assume that the fully qualified name
+ of this directory will be "Work:ghostscript". Enter this directory and
+ unpack the archive "gs-2.6.1-amiga.lha". This will create the directory
+ "doc" which contains the Ghostscript documentation files, and the directory
+ "examples" which is to hold some Postscript example files. To add the fonts
+ from the Ghostscript distribution (not included in this release) create a
+ directory called "Fonts" in the directory "Work:ghostscript" and copy all
+ the font files into it. You also need the `ixemul.library' included in the
+ Amiga GCC distribution which should be copied to the `Libs:' directory. Now
+ edit your `S:User-Startup' file, adding the following lines:
+
+ Assign ghostscript: "Work:ghostscript"
+ Path ghostscript: add
+
+ Save the file back to disk and reboot your machine.
+
+
+ Running the interpreter
+ -----------------------
+ Enter the command line interpreter, type "gs" and press return. The
+ interpreter will be loaded and will try to initialize itself. If
+ successfully initialized, a window should have been opened on the Workbench
+ screen. The Shell window now should display the following text:
+
+ Initializing... done.
+ Ghostscript 2.6.1 (5/28/93)
+ Copyright (C) 1990-1993 Aladdin Enterprises, Menlo Park, CA.
+ All rights reserved.
+ Ghostscript comes with NO WARRANTY: see the file COPYING for details.
+ GS>
+
+ At the command prompt, enter "(ghostscript:examples/golfer.ps) run" and
+ press return. Click on the `Zoom' button in the top right corner of the
+ window to bring it to full screen size, move the scrollers and watch what
+ will happen. When rendering is finished, the Shell window will display the
+ following text:
+
+ >>showpage, press <return> to continue<<
+
+ Press return to erase the contents of the window and to continue. The
+ interpreter will be in interactive mode again, enter "quit" and press
+ return to end this session.
+
+ For more information refer to the documentation in the "ghostscript:doc"
+ drawer.
+
+
+ How to print a document
+ -----------------------
+ As the corresponding Ghostscript device will always keep the entire page in
+ memory the printer need not be capable of strip-printing. The bad news is
+ that the entire page will consume *a lot* of memory. This Amiga port will
+ keep the page in any public memory area, so it will not necessarily eat up
+ precious chip memory. This should make it possible to print pages on Amigas
+ with only 1 MByte of chip memory or less, provided enough fast memory is
+ available.
+
+ Enter the command line interpreter, type "gs -sDEVICE=amiga_printer" and
+ press return. This will invoke the Ghostscript interpreter with the
+ "amiga_printer" device driver selected as the startup device. When the
+ command prompt appears, enter "(ghostscript:examples/butterfly.ps) run" and
+ press return. The rendered image will be sent to the printer. When printing
+ is finished, press return and enter "quit" to end this session.
+
+ Note: unless you want Ghostscript to prompt you to press return after each
+ page is printed and ejected you should include "-dNOPAUSE" on the command
+ line.
+
+
+ Available device drivers
+ ------------------------
+ This port implements the following nine device drivers:
+
+ amiga
+
+ (This is the default output device)
+
+ Rendering takes place in a super-bitmap window to be opened on the
+ Workbench screen. This window contains scroller handles to move
+ around in the bitmap. Usually, the bitmap will be four times as large
+ as the screen the window opens upon.
+
+ amiga_low
+
+ Renders into a low-resolution custom screen.
+
+ amiga_high
+
+ Renders into a high-resolution custom screen.
+
+ amiga_super
+
+ Renders into a super-high-resolution custom screen.
+
+ amiga_a2024¹
+
+ Renders into an A2024 resolution custom screen.
+
+ amiga_picassoii
+
+ Renders into a Picasso II custom screen (note: a plain Intuition
+ custom screen will be opened, this driver will not directly access
+ the Picasso II hardware). The Picasso monitor driver v2.14 is
+ required for this driver to work.
+
+ amiga_custom
+
+ Unlike the other display drivers which will open screens in
+ predefined resolutions and modes the `amiga_custom' driver will let
+ you select the display mode to use. On first invocation of the driver
+ a screen mode requester will be opened for you to select the display
+ mode to use. The name of the display mode selected will be stored in
+ a local environment variable called "GSCUSTOMMODE". The next time you
+ run the GhostScript interpreter with the `amiga_custom' device
+ selected the device will try to read the contents of the
+ "GSCUSTOMMODE" variable. The list of screen display modes available
+ will be scanned for a mode which name matches the variable. Wildcard
+ patterns are supported, so setting "GSCUSTOMMODE" to "#?lowres#?"
+ will match any screen display mode with the string "lowres" in it,
+ such as "NTSC:LowRes", "PAL:LowRes", etc. If you wish, you could set
+ the global environment variable "GSCUSTOMMODE" to a special value
+ which the `amiga_custom' device will always use. Please note that the
+ screen mode requester will only be opened if no local or global
+ environment variable "GSCUSTOMMODE" is defined.
+
+ amiga_printer
+
+ Outputs pages on the currently configured preferences printer.
+ Respects density and resolution settings. Requires a lot of memory to
+ run.
+
+ amiga_ilbm¹
+
+ Will prompt for a file name to save the current page contents to. The
+ page will be saved as a standard IFF-ILBM picture, including DPI
+ information, suitable for postprocessing using standard image
+ processing and editing software.
+
+
+ ¹) Monochrome output only
+
+
+ Properties
+ ----------
+ With Ghostscript 2.6.1 one can specify several driver specific options on
+ the command line. As for the Amiga drivers, they support the following
+ properties:
+
+ - PageWidth and PageHeight
+
+ The dimensions of the page to render into. The physical page size
+ Ghostscript will use for rendering is limited by these dimensions. On
+ startup The Amiga drivers will default to a page size roughly equivalent
+ to A4 unless different dimensions are specified. The size definitions may
+ include measuring units (e.g. "-sPageWidth=21cm"), the following units
+ are supported: pt (points, the default if no unit is given), pc (picas),
+ in (inches), cm (centimeters), mm (millimeters), dd (didôt points), cc
+ (ciceros).
+
+ - OutputFile
+
+ The amiga_ilbm device pays attention to this property, which it will use
+ to construct the output file names for pages to be saved with. Thus,
+ `-sOutputFile="ram:page"' yields the files "ram:page0001.ilbm",
+ "ram:page0002.ilbm", etc.
+
+
+ Not all devices will pay attention to DPI page resolutions.
+
+
+ Installing fonts
+ ----------------
+ The Ghostscript distribution includes a number of public-domain or
+ otherwise freely distributable fonts. However, these are mostly of poor
+ quality. In order to install a new font or to replace a font with a
+ different one, the following steps are required:
+
+ 1. The font must be converted to Ghostscript format. For font files in
+ BDF-format (such as the fonts included in the X-Windows distribution)
+ this requires processing with the "bdftops" script file (syntax is
+ "bdftops <Source file> <Destination file>"). Fonts in standard ASCII text
+ format (".PFA" format) or packed binary file format (".PFB" format), such
+ as most Adobe-Type-1 hinted outline fonts to be purchased from various
+ vendors, need not be converted as this is the native format Ghostscript
+ expects.
+
+ 2. Copy the resulting output file to the "ghostscript:fonts" drawer, choose
+ a suitable name (see the file "ghostscript:fontmap" for more
+ information).
+
+ 3. Edit the file "ghostscript:fontmap" to include the font which will make
+ it visible to the interpreter. Read this file carefully as it gives basic
+ hints how to name a font file and how to edit the corresponding font
+ entry.
+
+
+ The Workbench window
+ --------------------
+ The default output device (the Workbench window) can be controlled both by
+ mouse and by keyboard:
+
+ Cursor keys will move the currently visible area of the page, holding
+ down a Shift or Control key will increase the size of the scrolling
+ steps.
+
+ Control+C and Escape will send the interpreter a signal to terminate
+ processing, so does clicking the window close button.
+
+ By default the page size will always be four times as large as the
+ currently visible portion of the Workbench screen, see the section entitled
+ "Page sizes and resolutions" for more information.
+
+
+ Troubleshooting
+ ---------------
+ This interpreter implementation requires a lot of chip memory to run. In
+ order to assure that enough memory will be available, close any Workbench
+ drawers or Shell windows which are not necessarily require to run the
+ interpreter.
+
+ Most Postscript documents use hard-coded document page sizes, i.e. the
+ output page size will not be scaled to fit the currently set output page
+ size. In these cases you may want to make use of the Postscript "scale"
+ operator. Say, you wish to preview the file "butterfly.ps" in just half its
+ size. Enter "0.5 dup scale" and press return, now enter "(butterfly.ps)
+ run" and press return; et voilà: the butterfly will be rendered just half
+ as large as usual.
+
+ Some documents, such as "porsche.ps", contain no "showpage" command to
+ finish the batch job. In this case, type "showpage" and press return or
+ enter "erasepage" and press return to clear the page.
+
+
+ About the Amiga port
+ --------------------
+ This port is based on Ghostscript 2.6.1. It was implemented using GCC
+ 2.4.5, so you will have to refer to the file "COPYING" for copying and
+ licensing information.
+
+ This Amiga port was created by:
+
+ Olaf `Olsen' Barthel
+ Brabeckstrasse 35
+ D-30559 Hannover
+
+ Federal Republic of Germany
+
+ eMail: olsen@sourcery.han.de
+
+ The source code is included in the "amiga-src" drawer.
diff -rc --new-file ghostscript-2.6.1-fsf/bdftops ghostscript-2.6.1-amiga/bdftops
*** ghostscript-2.6.1-fsf/bdftops Tue Oct 22 07:12:14 1991
--- ghostscript-2.6.1-amiga/bdftops Thu Jan 27 21:39:12 1994
***************
*** 1 ****
! gs -q -dNODISPLAY -- bdftops.ps $*
--- 1,4 ----
! .key ARGS/F
! .bra {
! .ket }
! gs -q -dNODISPLAY -- bdftops.ps {ARGS}
diff -rc --new-file ghostscript-2.6.1-fsf/font2c ghostscript-2.6.1-amiga/font2c
*** ghostscript-2.6.1-fsf/font2c Tue Feb 25 10:24:34 1992
--- ghostscript-2.6.1-amiga/font2c Thu Jan 27 21:39:30 1994
***************
*** 1 ****
! gs -q -dNODISPLAY -dWRITESYSTEMDICT -- font2c.ps $*
--- 1,4 ----
! .key ARGS/F
! .bra {
! .ket }
! gs -q -dNODISPLAY -dWRITESYSTEMDICT -- font2c.ps {ARGS}
diff -rc --new-file ghostscript-2.6.1-fsf/gdevamiga.c ghostscript-2.6.1-amiga/gdevamiga.c
*** ghostscript-2.6.1-fsf/gdevamiga.c Thu Jan 1 00:00:00 1970
--- ghostscript-2.6.1-amiga/gdevamiga.c Wed Feb 2 13:21:04 1994
***************
*** 0 ****
--- 1,5537 ----
+ /* Copyright (C) 1992 Aladdin Enterprises. All rights reserved.
+ Distributed by Free Software Foundation, Inc.
+
+ 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. */
+
+ /* gdevamiga.c */
+ /* Amiga driver for Ghostscript library, requires Kickstart 2.04 or higher */
+
+ /* Written by Olaf `Olsen' Barthel, last change 29 January 1994
+ *
+ * My address: Olaf Barthel
+ * Brabeckstrasse 35
+ * D-30559 Hannover
+ *
+ * eMail: olsen@sourcery.han.de
+ */
+
+ #define CheckIO foo123
+ #define ushort foo
+
+ #include <intuition/intuitionbase.h>
+ #include <intuition/gadgetclass.h>
+ #include <intuition/imageclass.h>
+ #include <intuition/icclass.h>
+ #include <graphics/displayinfo.h>
+ #include <libraries/iffparse.h>
+ #include <graphics/gfxbase.h>
+ #include <devices/printer.h>
+ #include <devices/prtbase.h>
+ #include <devices/prtgfx.h>
+ #include <libraries/asl.h>
+ #include <exec/memory.h>
+ #include <clib/macros.h>
+ #include <dos/dostags.h>
+ #include <dos/rdargs.h>
+ #include <dos/var.h>
+ #include <dos/dos.h>
+
+ #include <clib/intuition_protos.h>
+ #include <clib/graphics_protos.h>
+ #include <clib/iffparse_protos.h>
+ #include <clib/utility_protos.h>
+ #include <clib/layers_protos.h>
+ #include <clib/exec_protos.h>
+ #include <clib/dos_protos.h>
+ #include <clib/asl_protos.h>
+
+ /*
+ #include <inline/stubs.h>
+ #include <inline/iffparse.h>
+ #include <inline/utility.h>
+ #include <inline/exec.h>
+ #include <inline/dos.h>
+ */
+
+ #include <string.h>
+ #include <signal.h>
+
+ #undef ushort
+ #undef CheckIO
+
+ struct IORequest *CheckIO(struct IORequest *);
+
+ #include "gx.h" /* for gx_bitmap; includes std.h */
+ #include "gsmatrix.h" /* needed for gxdevice.h */
+ #include "gxdevice.h"
+ #include "gserrors.h"
+ #include "gsprops.h"
+
+ /* Here is how to select a default page size format:
+ *
+ * Either enter include a line such as
+ *
+ * #define AMIGA_PAGE_A4 1
+ *
+ * Somewhere above in this module, or edit the makefile
+ * to feature the option
+ *
+ * -dAMIGA_PAGE_A4
+ *
+ * among the device specific flags. Available default page
+ * size formats are:
+ *
+ * AMIGA_PAGE_A4 European A4 page size (default)
+ * AMIGA_PAGE_A3 European A3 page size
+ * AMIGA_PAGE_LETTER US letter page size
+ * AMIGA_PAGE_LEGAL US legal page size
+ * AMIGA_PAGE_LEDGER US ledger paper size
+ * AMIGA_PAGE_TABLOID US tabloid paper size
+ */
+
+ /* Select the default paper size if none specified. */
+
+ #if !defined(AMIGA_PAGE_A4) && !defined(AMIGA_PAGE_A3) && !defined(AMIGA_PAGE_LETTER) && !defined(AMIGA_PAGE_LEGAL) && !defined(AMIGA_PAGE_LEDGER) && !defined(AMIGA_PAGE_TABLOID)
+ /*#define AMIGA_PAGE_A4 1*/
+ #define AMIGA_PAGE_A3 1
+ #endif /* PAGE SIZE */
+
+ /* A4 page size (in inches!) */
+
+ #ifdef AMIGA_PAGE_A4
+ #define DEFAULT_WIDTH 8.2
+ #define DEFAULT_HEIGHT 11.6
+ #endif /* AMIGA_PAGE_A4 */
+
+ /* A3 page size */
+
+ #ifdef AMIGA_PAGE_A3
+ #define DEFAULT_WIDTH 11.6
+ #define DEFAULT_HEIGHT 16.5
+ #endif /* AMIGA_PAGE_A4 */
+
+ /* US letter page size */
+
+ #ifdef AMIGA_PAGE_LETTER
+ #define DEFAULT_WIDTH 8.5
+ #define DEFAULT_HEIGHT 11.0
+ #endif /* AMIGA_PAGE_LETTER */
+
+ /* US legal page size */
+
+ #ifdef AMIGA_PAGE_LEGAL
+ #define DEFAULT_WIDTH 8.5
+ #define DEFAULT_HEIGHT 14.0
+ #endif /* AMIGA_PAGE_LEGAL */
+
+ /* US ledger page size */
+
+ #ifdef AMIGA_PAGE_LEDGER
+ #define DEFAULT_WIDTH 16.0
+ #define DEFAULT_HEIGHT 11.0
+ #endif /* AMIGA_PAGE_LEDGER */
+
+ /* US tabloid page size */
+
+ #ifdef AMIGA_PAGE_TABLOID
+ #define DEFAULT_WIDTH 11.0
+ #define DEFAULT_HEIGHT 17.0
+ #endif /* AMIGA_PAGE_LEDGER */
+
+ /* Default output file name. */
+
+ #define DEFAULT_FILENAME "gs_page"
+
+ /* Turn a byte into a 24 bit colour value. */
+
+ #define SPREAD(i) ((ULONG)(i) << 24 | (ULONG)(i) << 16 | (ULONG)(i) << 8 | (i))
+
+ /* Scroller gadget IDs. */
+
+ enum { VERTICAL_SCROLLER, HORIZONTAL_SCROLLER,
+ UP_ARROW, DOWN_ARROW,
+ LEFT_ARROW, RIGHT_ARROW,
+
+ GADGET_COUNT };
+
+ /* Scroller arrow IDs. */
+
+ enum { UP_IMAGE, DOWN_IMAGE,
+ LEFT_IMAGE, RIGHT_IMAGE,
+
+ IMAGE_COUNT };
+
+ /* Codes for the MoveAround() routine. */
+
+ enum { MOVE_MIN,MOVE_FAR_DOWN,MOVE_DOWN,MOVE_UP,MOVE_FAR_UP,MOVE_MAX };
+
+ /* Some handy bit masks. */
+
+ #define SIG_KILL SIGBREAKF_CTRL_C
+ #define SIG_HANDSHAKE SIGF_SINGLE
+
+ /* Static dimensions of scroller arrows. */
+
+ #define ARROW_WIDTH 16
+ #define ARROW_HEIGHT 11
+
+ /* The `Help' key raw code. */
+
+ #define HELP_CODE 95
+
+ /* Minimum window inner area dimension. */
+
+ #define MINIMUM_WIDTH 64
+ #define MINIMUM_HEIGHT 32
+
+ /* Handy superbitmap window macros. */
+
+ #define LAYERXOFFSET(w) ((w) -> RPort -> Layer -> Scroll_X)
+ #define LAYERYOFFSET(w) ((w) -> RPort -> Layer -> Scroll_Y)
+
+ /* User input to listen to. */
+
+ #define IDCMP_FLAGS (IDCMP_IDCMPUPDATE | IDCMP_GADGETUP | IDCMP_GADGETDOWN | IDCMP_MOUSEMOVE | IDCMP_NEWSIZE | IDCMP_CLOSEWINDOW | IDCMP_VANILLAKEY | IDCMP_RAWKEY)
+
+ /* Chunk IDs. */
+
+ #define ID_ILBM MAKE_ID('I','L','B','M')
+ #define ID_BMHD MAKE_ID('B','M','H','D')
+ #define ID_CMAP MAKE_ID('C','M','A','P')
+ #define ID_CAMG MAKE_ID('C','A','M','G')
+ #define ID_ANNO MAKE_ID('A','N','N','O')
+ #define ID_DPI MAKE_ID('D','P','I',' ')
+ #define ID_BODY MAKE_ID('B','O','D','Y')
+
+ /* Chunk contents definitions. */
+
+ typedef struct
+ {
+ UWORD w,h; /* raster width & height in pixels */
+ WORD x,y; /* position for this image */
+ UBYTE nPlanes; /* # source bitplanes */
+ UBYTE masking; /* masking technique */
+ UBYTE compression; /* compression algoithm */
+ UBYTE pad1; /* UNUSED. For consistency, put 0 here.*/
+ UWORD transparentColor; /* transparent "color number" */
+ UBYTE xAspect,yAspect; /* aspect ratio, a rational number x/y */
+ WORD pageWidth,pageHeight; /* source "page" size in pixels */
+ } BitMapHeader;
+
+ typedef struct
+ {
+ UWORD dpi_x;
+ UWORD dpi_y;
+ } DPIHeader;
+
+ /* Packer modes. */
+
+ #define DUMP 0
+ #define RUN 1
+
+ /* Minimum data run size, maximum data run size and maximum cache size. */
+
+ #define MINRUN 3
+ #define MAXRUN 128
+ #define MAXDAT 128
+
+ /* This module actually implements four different Amiga based
+ * devices. As the rendering operations are all the same,
+ * one single device definition is sufficient.
+ */
+
+ typedef struct gx_device_amiga
+ {
+ gx_device_common;
+
+ struct Screen *screen; /* Any screen */
+ struct Window *window; /* Some window to be opened on the Workbench screen */
+
+ LONG super_width, /* Superbitmap width */
+ super_height; /* Superbitmap height */
+
+ struct BitMap *super_bitmap; /* Window superbitmap area */
+ struct Gadget **gadget; /* Scroller gadgets */
+ struct Image **image; /* Scroller arrow images */
+
+ struct Task *dispatcher; /* Slider dispatch task */
+ struct Process *main; /* Main program */
+
+ struct RastPort *rport; /* Rendering area */
+
+ struct IODRPReq *printer; /* Printer interface data */
+ struct MsgPort *port; /* Printer io data */
+
+ struct ColorMap *colormap; /* A black/white colour map */
+ struct BitMap *bitmap; /* Rendering bitmap data */
+ PLANEPTR bitplane; /* Rendering raster */
+
+ gx_color_index last_pen; /* The last colour set */
+
+ float page_width, /* The page width */
+ page_height; /* The page height */
+ char file_name[256];/* The output file name */
+ int page_count; /* The page number counter */
+
+ int cube_size; /* Colour cube size, 0 for b/w */
+ struct RastPort *temp_rport; /* Temporary raster port for pixmap imaging. */
+ UBYTE *temp_array; /* Temporary colour manipulation array. */
+ LONG *pens;
+ } gx_device_amiga;
+
+ /* Function prototypes */
+
+ VOID set_mono_device(gx_device_amiga *dev);
+ VOID set_colour_device(gx_device_amiga *dev,int cube_size,LONG *pens);
+ VOID set_colour_printer_device(gx_device_amiga *dev,LONG CubeSize);
+ VOID DeleteBitMap(struct BitMap *BitMap,BOOL Private);
+ struct BitMap * CreateBitMap(LONG Width,LONG Height,LONG Depth,ULONG Flags,struct BitMap *Friend,BOOL Private);
+ VOID DeleteTempRPort(struct RastPort *Temp);
+ struct RastPort * CreateTempRPort(struct RastPort *Source);
+ LONG Euclid(LONG a,LONG b);
+ BYTE * PutDump(register BYTE *Destination,register LONG Count);
+ BYTE * PutRun(register BYTE *Destination,LONG Count,WORD Char);
+ LONG PackRow(PLANEPTR *SourcePtr,register BYTE *Destination,LONG RowSize);
+ BOOL PutBODY(struct IFFHandle *Handle,struct BitMap *BitMap);
+ BOOL PutANNO(struct IFFHandle *Handle);
+ BOOL PutCAMG(struct IFFHandle *Handle);
+ BOOL PutCMAP(struct IFFHandle *Handle);
+ BOOL PutDPI(struct IFFHandle *Handle,UWORD X_DPI,UWORD Y_DPI);
+ BOOL PutBMHD(struct IFFHandle *Handle,LONG Width,LONG Height,UWORD X_DPI,UWORD Y_DPI);
+ BOOL SaveBitMap(STRPTR Name,struct BitMap *BitMap,LONG Width,LONG Height,UWORD X_DPI,UWORD Y_DPI);
+ float GetInches(STRPTR Buffer);
+ VOID DispatchTask(VOID);
+ VOID DeleteScrollers(gx_device *dev);
+ BOOL CreateScrollers(gx_device *dev,struct Screen *Screen);
+ VOID WindowResize(gx_device *dev);
+ VOID WindowUpdate(struct Gadget *Gadget,gx_device *dev);
+ VOID MoveAround(struct Gadget *Gadget,LONG How,gx_device *dev);
+ VOID DispatchSuperWindow(gx_device *dev);
+ void devcleanup(VOID);
+ gx_color_index amiga_map_rgb_color(gx_device *dev,gx_color_value red,gx_color_value green,gx_color_value blue);
+ int amiga_map_color_rgb(gx_device *dev,gx_color_index color,gx_color_value rgb[3]);
+ LONG * AllocatePens(struct ViewPort *VPort,LONG CubeSize);
+ int amiga_open_default(gx_device *dev);
+ int amiga_open_low(gx_device *dev);
+ int amiga_open_high(gx_device *dev);
+ int amiga_open_super(gx_device *dev);
+ int amiga_open_a2024(gx_device *dev);
+ int amiga_open_picassoii(gx_device *dev);
+ int amiga_open_custom(gx_device *dev);
+ int amiga_open_printer(gx_device *dev);
+ int amiga_output_page_printer(gx_device *dev,int num_copies,int flush);
+ int amiga_close_printer(gx_device *dev);
+ int amiga_get_bits(gx_device *dev,int y,byte *str,byte **actual_data);
+ int amiga_open(gx_device *dev,ULONG Mode);
+ int amiga_output_page(gx_device *dev,int num_copies,int flush);
+ int amiga_close(gx_device *dev);
+ int amiga_fill_rectangle(gx_device *dev,int x,int y,int w,int h,gx_color_index color);
+ int amiga_copy_mono(gx_device *dev,const UBYTE *base,int sourcex,int raster,gx_bitmap_id id,int x,int y,int w,int h,gx_color_index zero,gx_color_index one);
+ int amiga_copy_color(gx_device *dev,const UBYTE *base,int sourcex,int raster,gx_bitmap_id id,int x,int y,int w,int h);
+ int amiga_draw_line(gx_device *dev,int x0,int y0,int x1,int y1,gx_color_index color);
+ int amiga_copy_mono_raw(gx_device *dev,const UBYTE *base,int sourcex,int raster,gx_bitmap_id id,int x,int y,int w,int h,gx_color_index zero,gx_color_index one);
+ int amiga_copy_color_raw(gx_device *dev,const UBYTE *base,int sourcex,int raster,gx_bitmap_id id,int x,int y,int w,int h);
+ int amiga_fill_rectangle_raw(gx_device *dev,int x,int y,int w,int h,gx_color_index color);
+ int amiga_draw_line_raw(gx_device *dev,int x,int y,int x1,int y1,gx_color_index color);
+ int amiga_open_ilbm(gx_device *dev);
+ int amiga_output_page_ilbm(gx_device *dev,int num_copies,int flush);
+ int amiga_close_ilbm(gx_device *dev);
+ int amiga_get_props(gx_device *dev,gs_prop_item *plist);
+ int amiga_put_props(gx_device *dev,gs_prop_item *plist,int count);
+ gx_color_index amiga_color_map_rgb_color(gx_device *dev,gx_color_value red,gx_color_value green,gx_color_value blue);
+ int amiga_color_map_color_rgb(gx_device *dev,gx_color_index color,gx_color_value rgb[3]);
+ gx_color_index amiga_color_map_rgb_color_pen(gx_device *dev,gx_color_value red,gx_color_value green,gx_color_value blue);
+ int amiga_color_map_color_rgb_pen(gx_device *dev,gx_color_index color,gx_color_value rgb[3]);
+ int amiga_copy_color8(gx_device *dev,const UBYTE *base,int sourcex,int raster,gx_bitmap_id id,int x,int y,int w,int h);
+ int amiga_copy_mono_raw_color(gx_device *dev,const UBYTE *base,int sourcex,int raster,gx_bitmap_id id,int x,int y,int w,int h,gx_color_index zero,gx_color_index one);
+ int amiga_copy_color_raw_color16(gx_device *dev,const UBYTE *data,int sourcex,int raster,gx_bitmap_id id,int x,int y,int w,int h);
+ int amiga_fill_rectangle_raw_color(gx_device *dev,int x,int y,int w,int h,gx_color_index color);
+ int amiga_draw_line_raw_color(gx_device *dev,int x,int y,int x1,int y1,gx_color_index color);
+
+ /* External reference to some libraries, required for version checking, etc. */
+
+ extern struct GfxBase *GfxBase;
+ extern struct Library *AslBase;
+
+ /* Number of packed bytes and pack buffer. */
+
+ LONG PackedBytes;
+ BYTE Buffer[MAXDAT + 1];
+
+ /* Bit masks. */
+
+ STATIC UBYTE shift[8] = { 128, 64, 32, 16, 8, 4, 2, 1 },
+ masks[8] = { 127,191,223,239,247,251,253,254 };
+
+ /* Device routine jump tables */
+
+ STATIC gx_device_procs amiga_default_procs =
+ {
+ amiga_open_default,
+ gx_default_get_initial_matrix,
+ gx_default_sync_output,
+ amiga_output_page,
+ amiga_close,
+ amiga_map_rgb_color,
+ amiga_map_color_rgb,
+ amiga_fill_rectangle,
+ gx_default_tile_rectangle,
+ amiga_copy_mono,
+ amiga_copy_color,
+ amiga_draw_line,
+ gx_default_get_bits,
+ amiga_get_props,
+ amiga_put_props
+ };
+
+ STATIC gx_device_procs amiga_low_procs =
+ {
+ amiga_open_low,
+ gx_default_get_initial_matrix,
+ gx_default_sync_output,
+ amiga_output_page,
+ amiga_close,
+ amiga_map_rgb_color,
+ amiga_map_color_rgb,
+ amiga_fill_rectangle,
+ gx_default_tile_rectangle,
+ amiga_copy_mono,
+ amiga_copy_color,
+ amiga_draw_line,
+ gx_default_get_bits,
+ amiga_get_props,
+ amiga_put_props
+ };
+
+ STATIC gx_device_procs amiga_high_procs =
+ {
+ amiga_open_high,
+ gx_default_get_initial_matrix,
+ gx_default_sync_output,
+ amiga_output_page,
+ amiga_close,
+ amiga_map_rgb_color,
+ amiga_map_color_rgb,
+ amiga_fill_rectangle,
+ gx_default_tile_rectangle,
+ amiga_copy_mono,
+ amiga_copy_color,
+ amiga_draw_line,
+ gx_default_get_bits,
+ amiga_get_props,
+ amiga_put_props
+ };
+
+ STATIC gx_device_procs amiga_super_procs =
+ {
+ amiga_open_super,
+ gx_default_get_initial_matrix,
+ gx_default_sync_output,
+ amiga_output_page,
+ amiga_close,
+ amiga_map_rgb_color,
+ amiga_map_color_rgb,
+ amiga_fill_rectangle,
+ gx_default_tile_rectangle,
+ amiga_copy_mono,
+ amiga_copy_color,
+ amiga_draw_line,
+ gx_default_get_bits,
+ amiga_get_props,
+ amiga_put_props
+ };
+
+ STATIC gx_device_procs amiga_a2024_procs =
+ {
+ amiga_open_a2024,
+ gx_default_get_initial_matrix,
+ gx_default_sync_output,
+ amiga_output_page,
+ amiga_close,
+ amiga_map_rgb_color,
+ amiga_map_color_rgb,
+ amiga_fill_rectangle,
+ gx_default_tile_rectangle,
+ amiga_copy_mono,
+ amiga_copy_color,
+ amiga_draw_line,
+ gx_default_get_bits,
+ amiga_get_props,
+ amiga_put_props
+ };
+
+ STATIC gx_device_procs amiga_picassoii_procs =
+ {
+ amiga_open_picassoii,
+ gx_default_get_initial_matrix,
+ gx_default_sync_output,
+ amiga_output_page,
+ amiga_close,
+ amiga_map_rgb_color,
+ amiga_map_color_rgb,
+ amiga_fill_rectangle,
+ gx_default_tile_rectangle,
+ amiga_copy_mono,
+ amiga_copy_color,
+ amiga_draw_line,
+ gx_default_get_bits,
+ amiga_get_props,
+ amiga_put_props
+ };
+
+ STATIC gx_device_procs amiga_custom_procs =
+ {
+ amiga_open_custom,
+ gx_default_get_initial_matrix,
+ gx_default_sync_output,
+ amiga_output_page,
+ amiga_close,
+ amiga_map_rgb_color,
+ amiga_map_color_rgb,
+ amiga_fill_rectangle,
+ gx_default_tile_rectangle,
+ amiga_copy_mono,
+ amiga_copy_color,
+ amiga_draw_line,
+ gx_default_get_bits,
+ amiga_get_props,
+ amiga_put_props
+ };
+
+ STATIC gx_device_procs amiga_printer_procs =
+ {
+ amiga_open_printer,
+ gx_default_get_initial_matrix,
+ gx_default_sync_output,
+ amiga_output_page_printer,
+ amiga_close_printer,
+ amiga_map_rgb_color,
+ amiga_map_color_rgb,
+ amiga_fill_rectangle_raw,
+ gx_default_tile_rectangle,
+ amiga_copy_mono_raw,
+ amiga_copy_color_raw,
+ amiga_draw_line_raw,
+ amiga_get_bits,
+ amiga_get_props,
+ amiga_put_props
+ };
+
+ STATIC gx_device_procs amiga_ilbm_procs =
+ {
+ amiga_open_ilbm,
+ gx_default_get_initial_matrix,
+ gx_default_sync_output,
+ amiga_output_page_ilbm,
+ amiga_close_ilbm,
+ amiga_map_rgb_color,
+ amiga_map_color_rgb,
+ amiga_fill_rectangle_raw,
+ gx_default_tile_rectangle,
+ amiga_copy_mono_raw,
+ amiga_copy_color_raw,
+ amiga_draw_line_raw,
+ amiga_get_bits,
+ amiga_get_props,
+ amiga_put_props
+ };
+
+ /* Default device: opens a window on the Workbench screen and renders into it */
+
+ gx_device_amiga gs_amiga_device =
+ {
+ sizeof(gx_device_amiga), /* params_size */
+ &amiga_default_procs, /* procs */
+ "amiga", /* dname */
+ 0, 0, /* width, height */
+ 72.27, 72.27, /* xdpi, ydpi */
+ no_margins, /* margins */
+ dci_black_and_white, /* color info */
+ 0, /* is_open */
+
+ NULL, /* screen */
+ NULL, /* window */
+
+ 0, /* super_width */
+ 0, /* super_height */
+ NULL, /* super_bitmap */
+ NULL, /* gadget */
+ NULL, /* image */
+
+ NULL, /* dispatcher */
+ NULL, /* main */
+
+ NULL, /* rport */
+
+ NULL, /* printer */
+ NULL, /* port */
+ NULL, /* colormap */
+ NULL, /* bitmap */
+ NULL, /* bitplane */
+
+ 1, /* last_pen */
+
+ DEFAULT_WIDTH, /* page width */
+ DEFAULT_HEIGHT, /* page height */
+ DEFAULT_FILENAME, /* output file */
+ 1, /* page counter */
+
+ 0, /* cube_size */
+ NULL, /* temp_rport */
+ NULL, /* temp_array */
+ NULL /* pens */
+ };
+
+ /* Low resolution device: opens a lores custom screen and renders into it */
+
+ gx_device_amiga gs_amiga_low_device =
+ {
+ sizeof(gx_device_amiga), /* params_size */
+ &amiga_low_procs, /* procs */
+ "amiga_low", /* dname */
+ 0, 0, /* width, height */
+ 72.27, 72.27, /* xdpi, ydpi */
+ no_margins, /* margins */
+ dci_black_and_white, /* color info */
+ 0, /* is_open */
+
+ NULL, /* screen */
+ NULL, /* window */
+
+ 0, /* super_width */
+ 0, /* super_height */
+ NULL, /* super_bitmap */
+ NULL, /* gadget */
+ NULL, /* image */
+
+ NULL, /* dispatcher */
+ NULL, /* main */
+
+ NULL, /* rport */
+
+ NULL, /* printer */
+ NULL, /* port */
+ NULL, /* colormap */
+ NULL, /* bitmap */
+ NULL, /* bitplane */
+
+ 1, /* last_pen */
+
+ DEFAULT_WIDTH, /* page width */
+ DEFAULT_HEIGHT, /* page height */
+ DEFAULT_FILENAME, /* output file */
+ 1, /* page counter */
+
+ 0, /* cube_size */
+ NULL, /* temp_rport */
+ NULL, /* temp_array */
+ NULL /* pens */
+ };
+
+ /* High resolution device: opens a highres-interlaced custom screen */
+
+ gx_device_amiga gs_amiga_high_device =
+ {
+ sizeof(gx_device_amiga), /* params_size */
+ &amiga_high_procs, /* procs */
+ "amiga_high", /* dname */
+ 0, 0, /* width, height */
+ 72.27, 72.27, /* xdpi, ydpi */
+ no_margins, /* margins */
+ dci_black_and_white, /* color info */
+ 0, /* is_open */
+
+ NULL, /* screen */
+ NULL, /* window */
+
+ 0, /* super_width */
+ 0, /* super_height */
+ NULL, /* super_bitmap */
+ NULL, /* gadget */
+ NULL, /* image */
+
+ NULL, /* dispatcher */
+ NULL, /* main */
+
+ NULL, /* rport */
+
+ NULL, /* printer */
+ NULL, /* port */
+ NULL, /* colormap */
+ NULL, /* bitmap */
+ NULL, /* bitplane */
+
+ 1, /* last_pen */
+
+ DEFAULT_WIDTH, /* page width */
+ DEFAULT_HEIGHT, /* page height */
+ DEFAULT_FILENAME, /* output file */
+ 1, /* page counter */
+
+ 0, /* cube_size */
+ NULL, /* temp_rport */
+ NULL, /* temp_array */
+ NULL /* pens */
+ };
+
+ /* Super high resolution device: opens a super-highres-interlaced custom screen */
+
+ gx_device_amiga gs_amiga_super_device =
+ {
+ sizeof(gx_device_amiga), /* params_size */
+ &amiga_super_procs, /* procs */
+ "amiga_super", /* dname */
+ 0, 0, /* width, height */
+ 72.27, 72.27, /* xdpi, ydpi */
+ no_margins, /* margins */
+ dci_black_and_white, /* color info */
+ 0, /* is_open */
+
+ NULL, /* screen */
+ NULL, /* window */
+
+ 0, /* super_width */
+ 0, /* super_height */
+ NULL, /* super_bitmap */
+ NULL, /* gadget */
+ NULL, /* image */
+
+ NULL, /* dispatcher */
+ NULL, /* main */
+
+ NULL, /* rport */
+
+ NULL, /* printer */
+ NULL, /* port */
+ NULL, /* colormap */
+ NULL, /* bitmap */
+ NULL, /* bitplane */
+
+ 1, /* last_pen */
+
+ DEFAULT_WIDTH, /* page width */
+ DEFAULT_HEIGHT, /* page height */
+ DEFAULT_FILENAME, /* output file */
+ 1, /* page counter */
+
+ 0, /* cube_size */
+ NULL, /* temp_rport */
+ NULL, /* temp_array */
+ NULL /* pens */
+ };
+
+ /* A2024 device: opens an A2024 custom screen */
+
+ gx_device_amiga gs_amiga_a2024_device =
+ {
+ sizeof(gx_device_amiga), /* params_size */
+ &amiga_a2024_procs, /* procs */
+ "amiga_a2024", /* dname */
+ 0, 0, /* width, height */
+ 72.27, 72.27, /* xdpi, ydpi */
+ no_margins, /* margins */
+ dci_black_and_white, /* color info */
+ 0, /* is_open */
+
+ NULL, /* screen */
+ NULL, /* window */
+
+ 0, /* super_width */
+ 0, /* super_height */
+ NULL, /* super_bitmap */
+ NULL, /* gadget */
+ NULL, /* image */
+
+ NULL, /* dispatcher */
+ NULL, /* main */
+
+ NULL, /* rport */
+
+ NULL, /* printer */
+ NULL, /* port */
+ NULL, /* colormap */
+ NULL, /* bitmap */
+ NULL, /* bitplane */
+
+ 1, /* last_pen */
+
+ DEFAULT_WIDTH, /* page width */
+ DEFAULT_HEIGHT, /* page height */
+ DEFAULT_FILENAME, /* output file */
+ 1, /* page counter */
+
+ 0, /* cube_size */
+ NULL, /* temp_rport */
+ NULL, /* temp_array */
+ NULL /* pens */
+ };
+
+ /* Picasso II device: opens a Picasso II custom screen */
+
+ gx_device_amiga gs_amiga_picassoii_device =
+ {
+ sizeof(gx_device_amiga), /* params_size */
+ &amiga_picassoii_procs, /* procs */
+ "amiga_picassoii", /* dname */
+ 0, 0, /* width, height */
+ 72.27, 72.27, /* xdpi, ydpi */
+ no_margins, /* margins */
+ dci_black_and_white, /* color info */
+ 0, /* is_open */
+
+ NULL, /* screen */
+ NULL, /* window */
+
+ 0, /* super_width */
+ 0, /* super_height */
+ NULL, /* super_bitmap */
+ NULL, /* gadget */
+ NULL, /* image */
+
+ NULL, /* dispatcher */
+ NULL, /* main */
+
+ NULL, /* rport */
+
+ NULL, /* printer */
+ NULL, /* port */
+ NULL, /* colormap */
+ NULL, /* bitmap */
+ NULL, /* bitplane */
+
+ 1, /* last_pen */
+
+ DEFAULT_WIDTH, /* page width */
+ DEFAULT_HEIGHT, /* page height */
+ DEFAULT_FILENAME, /* output file */
+ 1, /* page counter */
+
+ 0, /* cube_size */
+ NULL, /* temp_rport */
+ NULL, /* temp_array */
+ NULL /* pens */
+ };
+
+ /* Custom device: opens a custom screen, will ask for screen mode or check env variable. */
+
+ gx_device_amiga gs_amiga_custom_device =
+ {
+ sizeof(gx_device_amiga), /* params_size */
+ &amiga_custom_procs, /* procs */
+ "amiga_custom", /* dname */
+ 0, 0, /* width, height */
+ 72.27, 72.27, /* xdpi, ydpi */
+ no_margins, /* margins */
+ dci_black_and_white, /* color info */
+ 0, /* is_open */
+
+ NULL, /* screen */
+ NULL, /* window */
+
+ 0, /* super_width */
+ 0, /* super_height */
+ NULL, /* super_bitmap */
+ NULL, /* gadget */
+ NULL, /* image */
+
+ NULL, /* dispatcher */
+ NULL, /* main */
+
+ NULL, /* rport */
+
+ NULL, /* printer */
+ NULL, /* port */
+ NULL, /* colormap */
+ NULL, /* bitmap */
+ NULL, /* bitplane */
+
+ 1, /* last_pen */
+
+ DEFAULT_WIDTH, /* page width */
+ DEFAULT_HEIGHT, /* page height */
+ DEFAULT_FILENAME, /* output file */
+ 1, /* page counter */
+
+ 0, /* cube_size */
+ NULL, /* temp_rport */
+ NULL, /* temp_array */
+ NULL /* pens */
+ };
+
+ /* Printer device: renders the imagery and sends it to the printer */
+
+ gx_device_amiga gs_amiga_printer_device =
+ {
+ sizeof(gx_device_amiga), /* params_size */
+ &amiga_printer_procs, /* procs */
+ "amiga_printer", /* dname */
+ 0, 0, /* width, height */
+ 72.27, 72.27, /* xdpi, ydpi */
+ no_margins, /* margins */
+ dci_black_and_white, /* color info */
+ 0, /* is_open */
+
+ NULL, /* screen */
+ NULL, /* window */
+
+ 0, /* super_width */
+ 0, /* super_height */
+ NULL, /* super_bitmap */
+ NULL, /* gadget */
+ NULL, /* image */
+
+ NULL, /* dispatcher */
+ NULL, /* main */
+
+ NULL, /* rport */
+
+ NULL, /* printer */
+ NULL, /* port */
+ NULL, /* colormap */
+ NULL, /* bitmap */
+ NULL, /* bitplane */
+
+ 1, /* last_pen */
+
+ DEFAULT_WIDTH, /* page width */
+ DEFAULT_HEIGHT, /* page height */
+ DEFAULT_FILENAME, /* output file */
+ 1, /* page counter */
+
+ 0, /* cube_size */
+ NULL, /* temp_rport */
+ NULL, /* temp_array */
+ NULL /* pens */
+ };
+
+ /* ILBM device: renders the imagery and saves it to an IFF-ILBM file. */
+
+ gx_device_amiga gs_amiga_ilbm_device =
+ {
+ sizeof(gx_device_amiga), /* params_size */
+ &amiga_ilbm_procs, /* procs */
+ "amiga_ilbm", /* dname */
+ 0, 0, /* width, height */
+ 72.27, 72.27, /* xdpi, ydpi */
+ no_margins, /* margins */
+ dci_black_and_white, /* color info */
+ 0, /* is_open */
+
+ NULL, /* screen */
+ NULL, /* window */
+
+ 0, /* super_width */
+ 0, /* super_height */
+ NULL, /* super_bitmap */
+ NULL, /* gadget */
+ NULL, /* image */
+
+ NULL, /* dispatcher */
+ NULL, /* main */
+
+ NULL, /* rport */
+
+ NULL, /* printer */
+ NULL, /* port */
+ NULL, /* colormap */
+ NULL, /* bitmap */
+ NULL, /* bitplane */
+
+ 1, /* last_pen */
+
+ DEFAULT_WIDTH, /* page width */
+ DEFAULT_HEIGHT, /* page height */
+ DEFAULT_FILENAME, /* output file */
+ 1, /* page counter */
+
+ 0, /* cube_size */
+ NULL, /* temp_rport */
+ NULL, /* temp_array */
+ NULL /* pens */
+ };
+
+ /* Dark (black) and light (white) rendering colours; the default device
+ * determines the actual colours to be used by looking into the screen
+ * colour lookup table, the other device drivers leave these values
+ * untouched.
+ */
+
+ STATIC UBYTE DarkPen = 0,
+ LightPen = 1;
+
+ /* Cheap, but effective ;-) */
+
+ #define xdev ((gx_device_amiga *)dev)
+
+ /* set_mono_device(gx_device_amiga *dev,int cube_size,LONG *pens):
+ *
+ * Reconfigure a device for monochrome output.
+ */
+
+ VOID
+ set_mono_device(gx_device_amiga *dev)
+ {
+ xdev -> color_info . depth = 1;
+ xdev -> color_info . num_components = 1;
+ xdev -> color_info . max_gray = 1;
+ xdev -> color_info . max_rgb = 0;
+ xdev -> color_info . dither_gray = 2;
+ xdev -> color_info . dither_rgb = 0;
+
+ xdev -> procs -> copy_color = amiga_copy_color;
+ xdev -> procs -> map_rgb_color = amiga_map_rgb_color;
+ xdev -> procs -> map_color_rgb = amiga_map_color_rgb;
+
+ xdev -> cube_size = 0;
+ }
+
+ /* set_colour_device(gx_device_amiga *dev,int cube_size,LONG *pens):
+ *
+ * Reconfigure a device for colour output.
+ */
+
+ VOID
+ set_colour_device(gx_device_amiga *dev,int cube_size,LONG *pens)
+ {
+ xdev -> color_info . depth = 8;
+ xdev -> color_info . num_components = 3;
+ xdev -> color_info . max_gray = cube_size - 1;
+ xdev -> color_info . max_rgb = cube_size - 1;
+ xdev -> color_info . dither_gray = cube_size;
+ xdev -> color_info . dither_rgb = cube_size;
+
+ xdev -> procs -> copy_color = amiga_copy_color8;
+
+ /* Any colours to be remapped? */
+
+ if(pens)
+ {
+ xdev -> procs -> map_rgb_color = amiga_color_map_rgb_color_pen;
+ xdev -> procs -> map_color_rgb = amiga_color_map_color_rgb_pen;
+ xdev -> pens = pens;
+ }
+ else
+ {
+ xdev -> procs -> map_rgb_color = amiga_color_map_rgb_color;
+ xdev -> procs -> map_color_rgb = amiga_color_map_color_rgb;
+ }
+
+ /* Remember the size of the RGB cube. */
+
+ xdev -> cube_size = cube_size;
+ }
+
+ /* set_colour_printer_device(gx_device_amiga *dev,LONG CubeSize):
+ *
+ * Configure the printer device for colour output.
+ */
+
+ VOID
+ set_colour_printer_device(gx_device_amiga *dev,LONG CubeSize)
+ {
+ xdev -> color_info . depth = 16;
+ xdev -> color_info . num_components = 3;
+ xdev -> color_info . max_gray = CubeSize - 1;
+ xdev -> color_info . max_rgb = CubeSize - 1;
+ xdev -> color_info . dither_gray = CubeSize;
+ xdev -> color_info . dither_rgb = CubeSize;
+
+ xdev -> procs -> fill_rectangle = amiga_fill_rectangle_raw_color;
+ xdev -> procs -> copy_mono = amiga_copy_mono_raw_color;
+ xdev -> procs -> copy_color = amiga_copy_color_raw_color16;
+ xdev -> procs -> draw_line = amiga_draw_line_raw_color;
+ xdev -> procs -> get_bits = gx_default_get_bits;
+ xdev -> procs -> map_rgb_color = amiga_color_map_rgb_color;
+ xdev -> procs -> map_color_rgb = amiga_color_map_color_rgb;
+ xdev -> cube_size = CubeSize;
+ }
+
+ /* DeleteBitMap(struct BitMap *BitMap,BOOL Private):
+ *
+ * Free memory associated with a custom rendering bitmap.
+ */
+
+ VOID
+ DeleteBitMap(struct BitMap *BitMap,BOOL Private)
+ {
+ if(GfxBase -> LibNode . lib_Version >= 39 && !Private)
+ FreeBitMap(BitMap);
+ else
+ {
+ LONG i;
+
+ for(i = 0 ; i < BitMap -> Depth ; i++)
+ {
+ if(BitMap -> Planes[i])
+ FreeVec(BitMap -> Planes[i]);
+ }
+
+ FreeVec(BitMap);
+ }
+ }
+
+ /* CreateBitMap(LONG Width,LONG Height,LONG Depth,ULONG Flags,struct BitMap *Friend,BOOL Private):
+ *
+ * Create a custom rendering bitmap.
+ */
+
+ struct BitMap *
+ CreateBitMap(LONG Width,LONG Height,LONG Depth,ULONG Flags,struct BitMap *Friend,BOOL Private)
+ {
+ if(GfxBase -> LibNode . lib_Version >= 39 && !Private)
+ return(AllocBitMap(Width,Height,Depth,Flags,Friend));
+ else
+ {
+ struct BitMap *BitMap;
+ LONG Plus;
+ ULONG MemType;
+
+ /* Bitmap structure needs to be padded if more
+ * than the standard eight bitplanes are to be
+ * allocated.
+ */
+
+ if(Depth > 8)
+ Plus = (Depth - 8) * sizeof(PLANEPTR);
+ else
+ Plus = 0;
+
+ if(Private)
+ MemType = MEMF_ANY;
+ else
+ MemType = MEMF_CHIP;
+
+ if(BitMap = (struct BitMap *)AllocVec(sizeof(struct BitMap) + Plus,MEMF_ANY | MEMF_CLEAR))
+ {
+ LONG i,PageSize;
+
+ InitBitMap(BitMap,Depth,Width,Height);
+
+ PageSize = BitMap -> BytesPerRow * BitMap -> Rows;
+
+ for(i = 0 ; i < BitMap -> Depth ; i++)
+ {
+ if(!(BitMap -> Planes[i] = (PLANEPTR)AllocVec(PageSize,MemType)))
+ {
+ LONG j;
+
+ for(j = 0 ; j < i ; j++)
+ FreeVec(BitMap -> Planes[j]);
+
+ FreeVec(BitMap);
+
+ return(NULL);
+ }
+ }
+
+ return(BitMap);
+ }
+ }
+ }
+
+ /* DeleteTempRPort(struct RastPort *Temp):
+ *
+ * Free memory associated with a temporary raster port.
+ */
+
+ VOID
+ DeleteTempRPort(struct RastPort *Temp)
+ {
+ DeleteBitMap(Temp -> BitMap,FALSE);
+
+ FreeVec(Temp);
+ }
+
+ /* CreateTempRPort(struct RastPort *Source):
+ *
+ * Allocate memory for temporary raster port (one line high).
+ */
+
+ struct RastPort *
+ CreateTempRPort(struct RastPort *Source)
+ {
+ struct RastPort *Temp;
+
+ if(Temp = (struct RastPort *)AllocVec(sizeof(struct RastPort),MEMF_ANY))
+ {
+ LONG Width,Depth;
+
+ CopyMem(Source,Temp,sizeof(struct RastPort));
+
+ Temp -> Layer = NULL;
+
+ if(GfxBase -> LibNode . lib_Version >= 39)
+ {
+ Width = GetBitMapAttr(Source -> BitMap,BMA_WIDTH);
+ Depth = GetBitMapAttr(Source -> BitMap,BMA_DEPTH);
+ }
+ else
+ {
+ Width = Source -> BitMap -> BytesPerRow * 8;
+ Depth = Source -> BitMap -> Depth;
+ }
+
+ if(Temp -> BitMap = CreateBitMap(Width,1,Depth,NULL,Source -> BitMap,FALSE))
+ return(Temp);
+ else
+ FreeVec(Temp);
+ }
+
+ return(NULL);
+ }
+
+ /* Euclid(LONG a,LONG b):
+ *
+ * Compute the greatest common divisor of two integers.
+ */
+
+ LONG
+ Euclid(LONG a,LONG b)
+ {
+ do
+ {
+ if(a < b)
+ {
+ LONG t;
+
+ t = a;
+ a = b;
+ b = t;
+ }
+
+ a = a % b;
+ }
+ while(a);
+
+ return(b);
+ }
+
+ /* PutDump(register BYTE *Destination,register LONG Count):
+ *
+ * Store a byte dump.
+ */
+
+ BYTE *
+ PutDump(register BYTE *Destination,register LONG Count)
+ {
+ register BYTE *Source = Buffer;
+
+ *Destination++ = Count - 1;
+ PackedBytes += Count + 1;
+
+ while(Count--)
+ *Destination++ = *Source++;
+
+ return(Destination);
+ }
+
+ /* PutRun(register BYTE *Destination,LONG Count,WORD Char):
+ *
+ * Store a byte run.
+ */
+
+ BYTE *
+ PutRun(register BYTE *Destination,LONG Count,WORD Char)
+ {
+ *Destination++ = -(Count - 1);
+ *Destination++ = Char;
+ PackedBytes += 2;
+
+ return(Destination);
+ }
+
+ /* PackRow(PLANEPTR *SourcePtr,register BYTE *Destination,LONG RowSize):
+ *
+ * Pack a raster line using the CmpByteRun1 algorithm.
+ */
+
+ LONG
+ PackRow(PLANEPTR *SourcePtr,register BYTE *Destination,LONG RowSize)
+ {
+ register BYTE *Source = *SourcePtr;
+
+ WORD Buffered = 1,
+ RunStart = 0;
+ BYTE Mode = DUMP,
+ LastChar,
+ Char;
+
+ PackedBytes = 0;
+
+ Buffer[0] = LastChar = Char = *Source++;
+
+ RowSize--;
+
+ while(RowSize--)
+ {
+ Buffer[Buffered++] = Char = *Source++;
+
+ if(Mode)
+ {
+ if((Char != LastChar) || (Buffered - RunStart > MAXRUN))
+ {
+ Destination = PutRun(Destination,Buffered - 1 - RunStart,LastChar);
+ Buffer[0] = Char;
+ Buffered = 1;
+ RunStart = 0;
+ Mode = DUMP;
+ }
+ }
+ else
+ {
+ if(Buffered > MAXDAT)
+ {
+ Destination = PutDump(Destination,Buffered - 1);
+ Buffer[0] = Char;
+ Buffered = 1;
+ RunStart = 0;
+ }
+ else
+ {
+ if(Char == LastChar)
+ {
+ if(Buffered - RunStart >= MINRUN)
+ {
+ if(RunStart)
+ Destination = PutDump(Destination,RunStart);
+
+ Mode = RUN;
+ }
+ else
+ {
+ if(!RunStart)
+ Mode = RUN;
+ }
+ }
+ else
+ RunStart = Buffered - 1;
+ }
+ }
+
+ LastChar = Char;
+ }
+
+ if(Mode)
+ PutRun(Destination,Buffered - RunStart,LastChar);
+ else
+ PutDump(Destination,Buffered);
+
+ *SourcePtr = Source;
+
+ return(PackedBytes);
+ }
+
+ /* PutBODY(struct IFFHandle *Handle,struct BitMap *BitMap):
+ *
+ * Store a bitmap in a BODY chunk.
+ */
+
+ BOOL
+ PutBODY(struct IFFHandle *Handle,struct BitMap *BitMap)
+ {
+ PLANEPTR *Planes;
+ BYTE *PackBuffer;
+ BOOL Success = FALSE;
+ LONG PackedBytes,
+ i,j;
+
+ /* Allocate the bitplane information. */
+
+ if(Planes = (PLANEPTR *)AllocVec(BitMap -> Depth * sizeof(PLANEPTR *),MEMF_ANY | MEMF_CLEAR))
+ {
+ /* Allocate the compression buffer. */
+
+ if(PackBuffer = (BYTE *)AllocVec(BitMap -> BytesPerRow * 2,MEMF_ANY))
+ {
+ /* Copy the planes over. */
+
+ for(i = 0 ; i < BitMap -> Depth ; i++)
+ Planes[i] = BitMap -> Planes[i];
+
+ if(!PushChunk(Handle,0,ID_BODY,IFFSIZE_UNKNOWN))
+ {
+ Success = TRUE;
+
+ /* Run down the rows. */
+
+ for(i = 0 ; Success && i < BitMap -> Rows ; i++)
+ {
+ for(j = 0 ; Success && j < BitMap -> Depth ; j++)
+ {
+ /* Pack the data. */
+
+ PackedBytes = PackRow(&Planes[j],PackBuffer,BitMap -> BytesPerRow);
+
+ /* Write it to disk. */
+
+ if(WriteChunkRecords(Handle,PackBuffer,PackedBytes,1) != 1)
+ Success = FALSE;
+ }
+ }
+
+ if(PopChunk(Handle))
+ Success = FALSE;
+ }
+
+ FreeVec(PackBuffer);
+ }
+
+ FreeVec(Planes);
+ }
+
+ return(Success);
+ }
+
+ /* PutANNO(struct IFFHandle *Handle):
+ *
+ * Store annotation chunk.
+ */
+
+ BOOL
+ PutANNO(struct IFFHandle *Handle)
+ {
+ STATIC STRPTR Note = "Rendered by GNU Ghostscript 2.6.0";
+
+ if(!PushChunk(Handle,0,ID_ANNO,strlen(Note)))
+ {
+ if(WriteChunkRecords(Handle,Note,strlen(Note),1) == 1)
+ {
+ if(!PopChunk(Handle))
+ return(TRUE);
+ }
+ }
+
+ return(FALSE);
+ }
+
+ /* PutCAMG(struct IFFHandle *Handle):
+ *
+ * Store display mode chunk.
+ */
+
+ BOOL
+ PutCAMG(struct IFFHandle *Handle)
+ {
+ ULONG ViewModes = HIRESLACE_KEY;
+
+ if(!PushChunk(Handle,0,ID_CAMG,sizeof(ULONG)))
+ {
+ if(WriteChunkRecords(Handle,&ViewModes,sizeof(ULONG),1) == 1)
+ {
+ if(!PopChunk(Handle))
+ return(TRUE);
+ }
+ }
+
+ return(FALSE);
+ }
+
+ /* PutCMAP(struct IFFHandle *Handle):
+ *
+ * Store colour map chunk.
+ */
+
+ BOOL
+ PutCMAP(struct IFFHandle *Handle)
+ {
+ STATIC UBYTE Colours[2][3] =
+ {
+ 0x00,0x00,0x00,
+ 0xFF,0xFF,0xFF
+ };
+
+ if(!PushChunk(Handle,0,ID_CMAP,sizeof(Colours)))
+ {
+ if(WriteChunkRecords(Handle,Colours,2,3) == 3)
+ {
+ if(!PopChunk(Handle))
+ return(TRUE);
+ }
+ }
+
+ return(FALSE);
+ }
+
+ /* PutDPI(struct IFFHandle *Handle,UWORD X_DPI,UWORD Y_DPI):
+ *
+ * Store DPI chunk.
+ */
+
+ BOOL
+ PutDPI(struct IFFHandle *Handle,UWORD X_DPI,UWORD Y_DPI)
+ {
+ DPIHeader Header;
+
+ Header . dpi_x = X_DPI;
+ Header . dpi_y = Y_DPI;
+
+ if(!PushChunk(Handle,0,ID_DPI,sizeof(Header)))
+ {
+ if(WriteChunkRecords(Handle,&Header,sizeof(Header),1) == 1)
+ {
+ if(!PopChunk(Handle))
+ return(TRUE);
+ }
+ }
+
+ return(FALSE);
+ }
+
+ /* PutBMHD(struct IFFHandle *Handle,LONG Width,LONG Height,UWORD X_DPI,UWORD Y_DPI):
+ *
+ * Store BMHD chunk.
+ */
+
+ BOOL
+ PutBMHD(struct IFFHandle *Handle,LONG Width,LONG Height,UWORD X_DPI,UWORD Y_DPI)
+ {
+ /* Valid parameters? */
+
+ if(X_DPI > 0 && Y_DPI > 0 && Width > 0 && Height > 0)
+ {
+ BitMapHeader Header;
+ UWORD gcd;
+
+ /* So we can store neat & small
+ * aspect ration values.
+ */
+
+ gcd = Euclid(X_DPI,Y_DPI);
+
+ Header . w = Width;
+ Header . h = Height;
+ Header . pageWidth = Width;
+ Header . pageHeight = Height;
+ Header . x = 0;
+ Header . y = 0;
+ Header . nPlanes = 1;
+ Header . masking = 0;
+ Header . compression = 1;
+ Header . pad1 = 0;
+ Header . transparentColor = 0;
+ Header . xAspect = X_DPI / gcd;
+ Header . yAspect = Y_DPI / gcd;
+
+ if(!PushChunk(Handle,0,ID_BMHD,sizeof(Header)))
+ {
+ if(WriteChunkRecords(Handle,&Header,sizeof(Header),1) == 1)
+ {
+ if(!PopChunk(Handle))
+ return(TRUE);
+ }
+ }
+ }
+
+ return(FALSE);
+ }
+
+ /* SaveBitMap(STRPTR Name,struct BitMap *BitMap,LONG Width,LONG Height,UWORD X_DPI,UWORD Y_DPI):
+ *
+ * Store a bitmap in an IFF-ILBM file.
+ */
+
+ BOOL
+ SaveBitMap(STRPTR Name,struct BitMap *BitMap,LONG Width,LONG Height,UWORD X_DPI,UWORD Y_DPI)
+ {
+ struct IFFHandle *Handle;
+ BOOL Success = FALSE;
+
+ if(Handle = AllocIFF())
+ {
+ if(Handle -> iff_Stream = Open(Name,MODE_NEWFILE))
+ {
+ InitIFFasDOS(Handle);
+
+ if(!OpenIFF(Handle,IFFF_WRITE))
+ {
+ if(!PushChunk(Handle,ID_ILBM,ID_FORM,IFFSIZE_UNKNOWN))
+ {
+ if(PutBMHD(Handle,Width,Height,X_DPI,Y_DPI))
+ {
+ if(PutANNO(Handle))
+ {
+ if(PutCMAP(Handle))
+ {
+ if(PutCAMG(Handle))
+ {
+ if(PutDPI(Handle,X_DPI,Y_DPI))
+ {
+ if(PutBODY(Handle,BitMap))
+ Success = TRUE;
+ }
+ }
+ }
+ }
+ }
+
+ if(PopChunk(Handle))
+ Success = FALSE;
+ }
+
+ CloseIFF(Handle);
+ }
+
+ Close(Handle -> iff_Stream);
+
+ if(!Success)
+ DeleteFile(Name);
+ }
+
+ FreeIFF(Handle);
+ }
+
+ return(Success);
+ }
+
+ /* GetInches(STRPTR Buffer):
+ *
+ * Turn a parameter string into a number representing
+ * a certain number of inches.
+ */
+
+ float
+ GetInches(STRPTR Buffer)
+ {
+ STATIC struct { STRPTR Unit; float Factor; } Units[7] =
+ {
+ "pt", 1.0, /* Point */
+ "pc", 12.0, /* Pica */
+ "in", 72.72, /* Inch */
+ "cm", 72.72 / 2.54, /* Centimeter */
+ "mm", 727.2 / 2.54, /* Millimeter */
+ "dd", 1157.0 / 1238.0, /* Didot point */
+ "cc", 1157.0 / 103.0 /* Cicero */
+ };
+
+ UBYTE Temp[40];
+ float Value;
+ LONG i;
+
+ i = 0;
+
+ /* Strip the numeric part. */
+
+ while((Buffer[i] >= '0' && Buffer[i] <= '9') || Buffer[i] == '.' || Buffer[i] == '+' || Buffer[i] == '-' || Buffer[i] == 'e')
+ {
+ Temp[i] = Buffer[i];
+
+ i++;
+ }
+
+ /* Provide null-termination. */
+
+ Temp[i] = 0;
+
+ /* atof() appears to be broken in ixemul.library 39.45. */
+
+ sscanf(Temp,"%f",&Value);
+
+ Buffer += i;
+
+ /* Which measuring unit? */
+
+ for(i = 0 ; i < 7 ; i++)
+ {
+ /* Return the result in inches. */
+
+ if(!Stricmp(Buffer,Units[i] . Unit))
+ return(Value * Units[i] . Factor / 72.27);
+ }
+
+ /* Return the result in inches. */
+
+ return(Value / 72.27);
+ }
+
+ /* DispatchTask():
+ *
+ * Asynchronous window message dispatcher.
+ */
+
+ VOID
+ DispatchTask()
+ {
+ struct Task *me;
+ gx_device *dev;
+
+ /* Set up global data area base register. */
+
+ ix_geta4();
+
+ /* Who am I? */
+
+ me = FindTask(NULL);
+
+ /* Wait for wakeup call. */
+
+ Wait(SIG_HANDSHAKE);
+
+ /* Obtain device pointer. */
+
+ dev = me -> tc_UserData;
+
+ /* Enable user input. */
+
+ if(ModifyIDCMP(xdev -> window,IDCMP_FLAGS))
+ {
+ ULONG Mask = 1 << xdev -> window -> UserPort -> mp_SigBit,
+ Set;
+ BOOL Done = FALSE;
+
+ /* Fill in the dispatcher entry. */
+
+ xdev -> dispatcher = me;
+
+ /* Ring back. */
+
+ Signal((struct Task *)xdev -> main,SIG_HANDSHAKE);
+
+ /* Wait for input... */
+
+ do
+ {
+ Set = Wait(Mask | SIG_KILL);
+
+ if(Set & Mask)
+ DispatchSuperWindow(dev);
+
+ if(Set & SIG_KILL)
+ Done = TRUE;
+ }
+ while(!Done);
+
+ /* Disable user input. */
+
+ ModifyIDCMP(xdev -> window,NULL);
+ }
+
+ /* Disable task switching. */
+
+ Forbid();
+
+ /* Clear the dispatcher entry. */
+
+ xdev -> dispatcher = NULL;
+
+ /* Signal the main process that we are done. */
+
+ Signal((struct Task *)xdev -> main,SIG_HANDSHAKE);
+
+ /* Remove ourselves. */
+
+ RemTask(NULL);
+ }
+
+ /* DeleteScrollers(gx_device *dev):
+ *
+ * Delete the window border scrollers.
+ */
+
+ VOID
+ DeleteScrollers(gx_device *dev)
+ {
+ if(xdev -> gadget)
+ {
+ if(xdev -> gadget[HORIZONTAL_SCROLLER])
+ DisposeObject(xdev -> gadget[HORIZONTAL_SCROLLER]);
+
+ if(xdev -> gadget[VERTICAL_SCROLLER])
+ DisposeObject(xdev -> gadget[VERTICAL_SCROLLER]);
+
+ if(xdev -> gadget[UP_ARROW])
+ DisposeObject(xdev -> gadget[UP_ARROW]);
+
+ if(xdev -> gadget[DOWN_ARROW])
+ DisposeObject(xdev -> gadget[DOWN_ARROW]);
+
+ if(xdev -> gadget[LEFT_ARROW])
+ DisposeObject(xdev -> gadget[LEFT_ARROW]);
+
+ if(xdev -> gadget[RIGHT_ARROW])
+ DisposeObject(xdev -> gadget[RIGHT_ARROW]);
+
+ FreeVec(xdev -> gadget);
+
+ xdev -> gadget = NULL;
+ }
+
+ if(xdev -> image)
+ {
+ if(xdev -> image[UP_IMAGE])
+ DisposeObject(xdev -> image[UP_IMAGE]);
+
+ if(xdev -> image[DOWN_IMAGE])
+ DisposeObject(xdev -> image[DOWN_IMAGE]);
+
+ if(xdev -> image[LEFT_IMAGE])
+ DisposeObject(xdev -> image[LEFT_IMAGE]);
+
+ if(xdev -> image[RIGHT_IMAGE])
+ DisposeObject(xdev -> image[RIGHT_IMAGE]);
+
+ FreeVec(xdev -> image);
+
+ xdev -> image = NULL;
+ }
+ }
+
+ /* CreateScrollers(gx_device *dev,struct Screen *Screen):
+ *
+ * Create the window border scroller handles.
+ */
+
+ BOOL
+ CreateScrollers(gx_device *dev,struct Screen *Screen)
+ {
+ BOOL Result = FALSE;
+
+ if(xdev -> gadget = (struct Gadget **)AllocVec(sizeof(struct Gadget *) * GADGET_COUNT,MEMF_ANY | MEMF_CLEAR | MEMF_PUBLIC))
+ {
+ if(xdev -> image = (struct Image **)AllocVec(sizeof(struct Image *) * IMAGE_COUNT,MEMF_ANY | MEMF_CLEAR | MEMF_PUBLIC))
+ {
+ struct DrawInfo *DrawInfo;
+
+ if(DrawInfo = GetScreenDrawInfo(Screen))
+ {
+ LONG SizeWidth,
+ SizeHeight;
+ UWORD SizeType;
+
+ if(Screen -> Flags & SCREENHIRES)
+ {
+ SizeWidth = 18;
+ SizeHeight = 10;
+
+ SizeType = SYSISIZE_MEDRES;
+ }
+ else
+ {
+ SizeWidth = 13;
+ SizeHeight = 11;
+
+ SizeType = SYSISIZE_LOWRES;
+ }
+
+ if(xdev -> image[UP_IMAGE] = (struct Image *)NewObject(NULL,"sysiclass",
+ SYSIA_Size, SizeType,
+ SYSIA_Which, UPIMAGE,
+ SYSIA_DrawInfo, DrawInfo,
+ TAG_DONE))
+ {
+ if(xdev -> image[DOWN_IMAGE] = (struct Image *)NewObject(NULL,"sysiclass",
+ SYSIA_Size, SizeType,
+ SYSIA_Which, DOWNIMAGE,
+ SYSIA_DrawInfo, DrawInfo,
+ TAG_DONE))
+ {
+ if(xdev -> image[LEFT_IMAGE] = (struct Image *)NewObject(NULL,"sysiclass",
+ SYSIA_Size, SizeType,
+ SYSIA_Which, LEFTIMAGE,
+ SYSIA_DrawInfo, DrawInfo,
+ TAG_DONE))
+ {
+ if(xdev -> image[RIGHT_IMAGE] = (struct Image *)NewObject(NULL,"sysiclass",
+ SYSIA_Size, SizeType,
+ SYSIA_Which, RIGHTIMAGE,
+ SYSIA_DrawInfo, DrawInfo,
+ TAG_DONE))
+ {
+ if(xdev -> gadget[VERTICAL_SCROLLER] = NewObject(NULL,"propgclass",
+ GA_ID, VERTICAL_SCROLLER,
+
+ GA_Top, Screen -> WBorTop + Screen -> Font -> ta_YSize + 2,
+ GA_RelHeight, -(Screen -> WBorTop + Screen -> Font -> ta_YSize + 2 + SizeHeight + 1 + 2 * ARROW_HEIGHT),
+ GA_Width, SizeWidth - 8,
+ GA_RelRight, -(SizeWidth - 5),
+
+ GA_GZZGadget, TRUE,
+ GA_Immediate, TRUE,
+ GA_FollowMouse, TRUE,
+ GA_RelVerify, TRUE,
+ GA_RightBorder, TRUE,
+
+ PGA_Freedom, FREEVERT,
+ PGA_NewLook, TRUE,
+ PGA_Borderless, TRUE,
+
+ PGA_Visible, 1,
+ PGA_Total, 1,
+ TAG_DONE))
+ {
+ if(xdev -> gadget[HORIZONTAL_SCROLLER] = NewObject(NULL,"propgclass",
+ GA_ID, HORIZONTAL_SCROLLER,
+ GA_Previous, xdev -> gadget[VERTICAL_SCROLLER],
+
+ GA_Height, SizeHeight - 4,
+ GA_RelBottom, -(SizeHeight - 4 + 1),
+ GA_Left, 4,
+ GA_RelWidth, -(2 + SizeWidth + 4 + 2 * ARROW_WIDTH),
+
+ GA_GZZGadget, TRUE,
+ GA_Immediate, TRUE,
+ GA_FollowMouse, TRUE,
+ GA_RelVerify, TRUE,
+ GA_BottomBorder,TRUE,
+
+ PGA_Freedom, FREEHORIZ,
+ PGA_NewLook, TRUE,
+ PGA_Borderless, TRUE,
+
+ PGA_Visible, 1,
+ PGA_Total, 1,
+ TAG_DONE))
+ {
+ STATIC struct TagItem ArrowMappings[] = { GA_ID, GA_ID, TAG_END };
+
+ if(xdev -> gadget[UP_ARROW] = NewObject(NULL,"buttongclass",
+ GA_ID, UP_ARROW,
+ GA_Previous, xdev -> gadget[HORIZONTAL_SCROLLER],
+
+ GA_GZZGadget, TRUE,
+ GA_Image, xdev -> image[UP_IMAGE],
+ GA_RelRight, -(SizeWidth - 1),
+ GA_RelBottom, -(SizeHeight - 1 + 2 * ARROW_HEIGHT),
+ GA_Height, ARROW_HEIGHT,
+ GA_Width, SizeWidth,
+ GA_Immediate, TRUE,
+ GA_RelVerify, TRUE,
+ GA_RightBorder, TRUE,
+
+ ICA_TARGET, ICTARGET_IDCMP,
+ ICA_MAP, ArrowMappings,
+ TAG_DONE))
+ {
+ if(xdev -> gadget[DOWN_ARROW] = NewObject(NULL,"buttongclass",
+ GA_ID, DOWN_ARROW,
+ GA_Previous, xdev -> gadget[UP_ARROW],
+
+ GA_GZZGadget, TRUE,
+ GA_Image, xdev -> image[DOWN_IMAGE],
+ GA_RelRight, -(SizeWidth - 1),
+ GA_RelBottom, -(SizeHeight - 1 + ARROW_HEIGHT),
+ GA_Height, ARROW_HEIGHT,
+ GA_Width, SizeWidth,
+ GA_Immediate, TRUE,
+ GA_RelVerify, TRUE,
+ GA_RightBorder, TRUE,
+
+ ICA_TARGET, ICTARGET_IDCMP,
+ ICA_MAP, ArrowMappings,
+ TAG_DONE))
+ {
+ if(xdev -> gadget[LEFT_ARROW] = NewObject(NULL,"buttongclass",
+ GA_ID, LEFT_ARROW,
+ GA_Previous, xdev -> gadget[DOWN_ARROW],
+
+ GA_GZZGadget, TRUE,
+ GA_Image, xdev -> image[LEFT_IMAGE],
+ GA_RelRight, -(SizeWidth - 1 + 2 * ARROW_WIDTH),
+ GA_RelBottom, -(SizeHeight - 1),
+ GA_Height, SizeHeight,
+ GA_Width, ARROW_WIDTH,
+ GA_Immediate, TRUE,
+ GA_RelVerify, TRUE,
+ GA_BottomBorder,TRUE,
+
+ ICA_TARGET, ICTARGET_IDCMP,
+ ICA_MAP, ArrowMappings,
+ TAG_DONE))
+ {
+ if(xdev -> gadget[RIGHT_ARROW] = NewObject(NULL,"buttongclass",
+ GA_ID, RIGHT_ARROW,
+ GA_Previous, xdev -> gadget[LEFT_ARROW],
+
+ GA_GZZGadget, TRUE,
+ GA_Image, xdev -> image[RIGHT_IMAGE],
+ GA_RelRight, -(SizeWidth - 1 + ARROW_WIDTH),
+ GA_RelBottom, -(SizeHeight - 1),
+ GA_Height, SizeHeight,
+ GA_Width, ARROW_WIDTH,
+ GA_Immediate, TRUE,
+ GA_RelVerify, TRUE,
+ GA_BottomBorder,TRUE,
+
+ ICA_TARGET, ICTARGET_IDCMP,
+ ICA_MAP, ArrowMappings,
+ TAG_DONE))
+ Result = TRUE;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ FreeScreenDrawInfo(Screen,DrawInfo);
+ }
+ }
+ }
+
+ return(Result);
+ }
+
+ /* WindowResize(gx_device *dev):
+ *
+ * Update the slider sizes and positions after the window
+ * was resized.
+ */
+
+ VOID
+ WindowResize(gx_device *dev)
+ {
+ LONG DeltaX,
+ DeltaY,
+ Temp;
+
+ /* Query the current horizontal slider position. */
+
+ if((Temp = LAYERXOFFSET(xdev -> window) + xdev -> window -> GZZWidth) > xdev -> super_width)
+ DeltaX = xdev -> super_width - Temp;
+ else
+ DeltaX = 0;
+
+ /* Query the current vertical slider position. */
+
+ if((Temp = LAYERYOFFSET(xdev -> window) + xdev -> window -> GZZHeight) > xdev -> super_height)
+ DeltaY = xdev -> super_height - Temp;
+ else
+ DeltaY = 0;
+
+ /* Move the currently displayed window area around. */
+
+ if(DeltaX || DeltaY)
+ ScrollLayer(NULL,xdev -> window -> RPort -> Layer,DeltaX,DeltaY);
+
+ /* Update the new horizontal slider position and size. */
+
+ SetGadgetAttrs(xdev -> gadget[HORIZONTAL_SCROLLER],xdev -> window,NULL,
+ PGA_Top, LAYERXOFFSET(xdev -> window),
+ PGA_Visible, xdev -> window -> GZZWidth,
+ PGA_Total, xdev -> super_width,
+ TAG_DONE);
+
+ /* Update the new vertical slider position and size. */
+
+ SetGadgetAttrs(xdev -> gadget[VERTICAL_SCROLLER],xdev -> window,NULL,
+ PGA_Top, LAYERYOFFSET(xdev -> window),
+ PGA_Visible, xdev -> window -> GZZHeight,
+ PGA_Total, xdev -> super_height,
+ TAG_DONE);
+ }
+
+ /* WindowUpdate(struct Gadget *Gadget,gx_device *dev):
+ *
+ * Move the currently visible portion of the
+ * window according to the current slider
+ * position.
+ */
+
+ VOID
+ WindowUpdate(struct Gadget *Gadget,gx_device *dev)
+ {
+ LONG Storage;
+
+ switch(Gadget -> GadgetID)
+ {
+ case HORIZONTAL_SCROLLER:
+
+ if(GetAttr(PGA_Top,Gadget,&Storage))
+ ScrollLayer(NULL,xdev -> window -> RPort -> Layer,Storage - LAYERXOFFSET(xdev -> window),0);
+
+ break;
+
+ case VERTICAL_SCROLLER:
+
+ if(GetAttr(PGA_Top,Gadget,&Storage))
+ ScrollLayer(NULL,xdev -> window -> RPort -> Layer,0,Storage - LAYERYOFFSET(xdev -> window));
+
+ break;
+ }
+ }
+
+ /* MoveAround(struct Gadget *Gadget,int How,gx_device *dev):
+ *
+ * Move the currently visible window area according to
+ * user input.
+ */
+
+ VOID
+ MoveAround(struct Gadget *Gadget,LONG How,gx_device *dev)
+ {
+ LONG Storage;
+
+ if(GetAttr(PGA_Top,Gadget,&Storage))
+ {
+ LONG Max;
+
+ switch(Gadget -> GadgetID)
+ {
+ case HORIZONTAL_SCROLLER:
+
+ Max = xdev -> super_width - xdev -> window -> GZZWidth;
+ break;
+
+ case VERTICAL_SCROLLER:
+
+ Max = xdev -> super_height - xdev -> window -> GZZHeight;
+ break;
+ }
+
+ switch(How)
+ {
+ case MOVE_MIN:
+
+ Storage = 0;
+ break;
+
+ case MOVE_MAX:
+
+ Storage = Max;
+ break;
+
+ case MOVE_DOWN:
+
+ if(Storage > xdev -> super_height / 100)
+ Storage -= xdev -> super_height / 100;
+ else
+ Storage = 0;
+
+ break;
+
+ case MOVE_FAR_DOWN:
+
+ if(Storage > xdev -> super_height / 10)
+ Storage -= xdev -> super_height / 10;
+ else
+ Storage = 0;
+
+ break;
+
+ case MOVE_FAR_UP:
+
+ if(Storage + xdev -> super_width / 10 < Max)
+ Storage += xdev -> super_width / 10;
+ else
+ Storage = Max;
+
+ break;
+
+ case MOVE_UP:
+
+ if(Storage + xdev -> super_width / 100 < Max)
+ Storage += xdev -> super_width / 100;
+ else
+ Storage = Max;
+
+ break;
+ }
+
+ switch(Gadget -> GadgetID)
+ {
+ case HORIZONTAL_SCROLLER:
+
+ if(LAYERXOFFSET(xdev -> window) != Storage)
+ {
+ ScrollLayer(NULL,xdev -> window -> RPort -> Layer,Storage - LAYERXOFFSET(xdev -> window),0);
+
+ SetGadgetAttrs(Gadget,xdev -> window,NULL,
+ PGA_Top,Storage,
+ TAG_DONE);
+ }
+
+ break;
+
+ case VERTICAL_SCROLLER:
+
+ if(LAYERYOFFSET(xdev -> window) != Storage)
+ {
+ ScrollLayer(NULL,xdev -> window -> RPort -> Layer,0,Storage - LAYERYOFFSET(xdev -> window));
+
+ SetGadgetAttrs(Gadget,xdev -> window,NULL,
+ PGA_Top,Storage,
+ TAG_DONE);
+ }
+
+ break;
+ }
+ }
+ }
+
+ /* DispatchSuperWindow(gx_device *dev):
+ *
+ * Dispatch user window input.
+ */
+
+ VOID
+ DispatchSuperWindow(gx_device *dev)
+ {
+ STATIC struct Gadget *CurrentGadget = NULL;
+
+ struct IntuiMessage *IntuiMessage;
+ ULONG MsgClass,
+ MsgCode,
+ MsgQualifier;
+ struct Gadget *MsgGadget;
+
+ while(IntuiMessage = (struct IntuiMessage *)GetMsg(xdev -> window -> UserPort))
+ {
+ MsgClass = IntuiMessage -> Class;
+ MsgCode = IntuiMessage -> Code;
+ MsgQualifier = IntuiMessage -> Qualifier;
+ MsgGadget = IntuiMessage -> IAddress;
+
+ ReplyMsg((struct Message *)IntuiMessage);
+
+ switch(MsgClass)
+ {
+ case IDCMP_VANILLAKEY:
+
+ if(MsgCode == '\033' || MsgCode == '\003')
+ Signal((struct Task *)xdev -> main,SIG_KILL);
+
+ break;
+
+ case IDCMP_RAWKEY:
+
+ switch(MsgCode)
+ {
+ case HELP_CODE:
+
+ DisplayBeep(xdev -> window -> WScreen);
+
+ break;
+
+ case CURSORUP:
+
+ if(MsgQualifier & IEQUALIFIER_CONTROL)
+ MoveAround(xdev -> gadget[VERTICAL_SCROLLER],MOVE_MIN,dev);
+ else
+ {
+ if(MsgQualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT))
+ MoveAround(xdev -> gadget[VERTICAL_SCROLLER],MOVE_FAR_DOWN,dev);
+ else
+ MoveAround(xdev -> gadget[VERTICAL_SCROLLER],MOVE_DOWN,dev);
+ }
+
+ break;
+
+ case CURSORLEFT:
+
+ if(MsgQualifier & IEQUALIFIER_CONTROL)
+ MoveAround(xdev -> gadget[HORIZONTAL_SCROLLER],MOVE_MIN,dev);
+ else
+ {
+ if(MsgQualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT))
+ MoveAround(xdev -> gadget[HORIZONTAL_SCROLLER],MOVE_FAR_DOWN,dev);
+ else
+ MoveAround(xdev -> gadget[HORIZONTAL_SCROLLER],MOVE_DOWN,dev);
+ }
+
+ break;
+
+ case CURSORRIGHT:
+
+ if(MsgQualifier & IEQUALIFIER_CONTROL)
+ MoveAround(xdev -> gadget[HORIZONTAL_SCROLLER],MOVE_MAX,dev);
+ else
+ {
+ if(MsgQualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT))
+ MoveAround(xdev -> gadget[HORIZONTAL_SCROLLER],MOVE_FAR_UP,dev);
+ else
+ MoveAround(xdev -> gadget[HORIZONTAL_SCROLLER],MOVE_UP,dev);
+ }
+
+ break;
+
+ case CURSORDOWN:
+
+ if(MsgQualifier & IEQUALIFIER_CONTROL)
+ MoveAround(xdev -> gadget[VERTICAL_SCROLLER],MOVE_MAX,dev);
+ else
+ {
+ if(MsgQualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT))
+ MoveAround(xdev -> gadget[VERTICAL_SCROLLER],MOVE_FAR_UP,dev);
+ else
+ MoveAround(xdev -> gadget[VERTICAL_SCROLLER],MOVE_UP,dev);
+ }
+
+ break;
+
+ default:
+
+ break;
+ }
+
+ break;
+
+ case IDCMP_CLOSEWINDOW:
+
+ Signal((struct Task *)xdev -> main,SIG_KILL);
+
+ break;
+
+ case IDCMP_GADGETDOWN:
+
+ CurrentGadget = MsgGadget;
+
+ WindowUpdate(MsgGadget,dev);
+
+ break;
+
+ case IDCMP_GADGETUP:
+
+ CurrentGadget = NULL;
+
+ WindowUpdate(MsgGadget,dev);
+
+ break;
+
+ case IDCMP_MOUSEMOVE:
+
+ if(CurrentGadget)
+ WindowUpdate(CurrentGadget,dev);
+
+ break;
+
+ case IDCMP_IDCMPUPDATE:
+
+ switch(GetTagData(GA_ID,0,(struct TagItem *)MsgGadget))
+ {
+ case UP_ARROW:
+
+ MoveAround(xdev -> gadget[VERTICAL_SCROLLER],MOVE_DOWN,dev);
+ break;
+
+ case DOWN_ARROW:
+
+ MoveAround(xdev -> gadget[VERTICAL_SCROLLER],MOVE_UP,dev);
+ break;
+
+ case LEFT_ARROW:
+
+ MoveAround(xdev -> gadget[HORIZONTAL_SCROLLER],MOVE_DOWN,dev);
+ break;
+
+ case RIGHT_ARROW:
+
+ MoveAround(xdev -> gadget[HORIZONTAL_SCROLLER],MOVE_UP,dev);
+ break;
+
+ default:
+
+ break;
+ }
+
+ break;
+
+ case IDCMP_NEWSIZE:
+
+ WindowResize(dev);
+
+ break;
+
+ default:
+
+ break;
+ }
+ }
+ }
+
+ /* Simple routine to call the cleanup routine of a device,
+ * all devices are smart enough to handle shutdown in
+ * case they have not been opened yet.
+ */
+
+ STATIC void __inline
+ close_device(gx_device_amiga *dev)
+ {
+ (*xdev -> procs -> close_device)((gx_device *)dev);
+ }
+
+ /* devcleanup():
+ *
+ * Clean up all devices, free all resources.
+ */
+
+ void
+ devcleanup()
+ {
+ close_device(&gs_amiga_device);
+ close_device(&gs_amiga_low_device);
+ close_device(&gs_amiga_high_device);
+ close_device(&gs_amiga_super_device);
+ close_device(&gs_amiga_a2024_device);
+ close_device(&gs_amiga_picassoii_device);
+ close_device(&gs_amiga_custom_device);
+ close_device(&gs_amiga_printer_device);
+ close_device(&gs_amiga_ilbm_device);
+ }
+
+ /* amiga_set_pen(gx_device *dev,gx_color_index color):
+ *
+ * Sets the rendering pen and remembers the current
+ * settings.
+ */
+
+ STATIC VOID __inline
+ amiga_set_pen(gx_device *dev,gx_color_index color)
+ {
+ if(xdev -> last_pen != color)
+ SetAPen(xdev -> rport,xdev -> last_pen = color);
+ }
+
+ /* amiga_map_rgb_color(gx_device *dev,gx_color_value red,gx_color_value green,gx_color_value blue):
+ *
+ * Map a colour either to the black or the light rendering pen.
+ */
+
+ gx_color_index
+ amiga_map_rgb_color(gx_device *dev,gx_color_value red,gx_color_value green,gx_color_value blue)
+ {
+ if((red | green | blue) > gx_max_color_value / 2)
+ return(LightPen);
+ else
+ return(DarkPen);
+ }
+
+ /* amiga_map_color_rgb(gx_device *dev,gx_color_index color,gx_color_value rgb[3]):
+ *
+ * Map the light/dark rendering pen to RGB values.
+ */
+
+ int
+ amiga_map_color_rgb(gx_device *dev,gx_color_index color,gx_color_value rgb[3])
+ {
+ int i;
+
+ if(color == LightPen)
+ {
+ for(i = 0 ; i < 3 ; i++)
+ rgb[i] = gx_max_color_value;
+ }
+ else
+ {
+ for(i = 0 ; i < 3 ; i++)
+ rgb[i] = 0;
+ }
+
+ return(0);
+ }
+
+ /* AllocatePens(struct ViewPort *VPort,LONG CubeSize):
+ *
+ * Allocate shareable viewport pens.
+ */
+
+ LONG *
+ AllocatePens(struct ViewPort *VPort,LONG CubeSize)
+ {
+ if(GfxBase -> LibNode . lib_Version >= 39)
+ {
+ LONG Total = CubeSize * CubeSize * CubeSize,*Pens;
+
+ if(Pens = (LONG *)AllocVec(sizeof(LONG) * Total,MEMF_ANY))
+ {
+ LONG i,r,g,b,max = CubeSize - 1;
+
+ for(i = 0 ; i < Total ; i++)
+ Pens[i] = -1;
+
+ i = 0;
+
+ for(r = 0 ; r < CubeSize ; r++)
+ {
+ for(g = 0 ; g < CubeSize ; g++)
+ {
+ for(b = 0 ; b < CubeSize ; b++)
+ {
+ if((Pens[i++] = ObtainBestPen(VPort -> ColorMap,SPREAD((255 * r) / max),SPREAD((255 * g) / max),SPREAD((255 * b) / max),
+ OBP_FailIfBad, TRUE,
+ OBP_Precision, PRECISION_IMAGE,
+ TAG_DONE)) == -1)
+ {
+ FreeVec(Pens);
+
+ return(NULL);
+ }
+ }
+ }
+ }
+
+ return(Pens);
+ }
+ }
+
+ return(NULL);
+ }
+
+ /* amiga_open_default(gx_device *dev):
+ *
+ * Open the default device, i.e. a window on the Workbench screen.
+ */
+
+ int
+ amiga_open_default(gx_device *dev)
+ {
+ struct Screen *DefaultScreen;
+
+ /* Get a lock on the default public screen. */
+
+ if(DefaultScreen = LockPubScreen(NULL))
+ {
+ struct DisplayInfo DisplayInfo;
+ ULONG Mode;
+
+ /* Get the default public screen display mode. */
+
+ Mode = GetVPModeID(&DefaultScreen -> ViewPort);
+
+ /* Inquire display mode information. */
+
+ if(GetDisplayInfoData(NULL,(APTR)&DisplayInfo,sizeof(struct DisplayInfo),DTAG_DISP,Mode))
+ {
+ LONG ScreenWidth,
+ ScreenHeight;
+ LONG i;
+ float Width,
+ Height;
+ LONG Depth;
+
+ if(GfxBase -> LibNode . lib_Version >= 39)
+ Depth = GetBitMapAttr(DefaultScreen -> RastPort . BitMap,BMA_DEPTH);
+ else
+ Depth = DefaultScreen -> RastPort . BitMap -> Depth;
+
+ /* Determine screen view dimensions. */
+
+ if(DefaultScreen -> ViewPort . ColorMap -> cm_vpe)
+ {
+ struct ViewPortExtra *Extra = DefaultScreen -> ViewPort . ColorMap -> cm_vpe;
+
+ ScreenWidth = Extra -> DisplayClip . MaxX - Extra -> DisplayClip . MinX + 1;
+ ScreenHeight = Extra -> DisplayClip . MaxY - Extra -> DisplayClip . MinY + 1;
+ }
+ else
+ {
+ struct ViewPortExtra *Extra;
+
+ if(Extra = (struct ViewPortExtra *)GfxLookUp(&DefaultScreen -> ViewPort))
+ {
+ ScreenWidth = Extra -> DisplayClip . MaxX - Extra -> DisplayClip . MinX + 1;
+ ScreenHeight = Extra -> DisplayClip . MaxY - Extra -> DisplayClip . MinY + 1;
+ }
+ else
+ {
+ ScreenWidth = DefaultScreen -> Width;
+ ScreenHeight = DefaultScreen -> Height;
+ }
+ }
+
+ /* Use the best guess, we will take the standard
+ * low resolution x-dpi value and scale it by
+ * the pixel speed.
+ */
+
+ if(DisplayInfo . PixelSpeed)
+ {
+ xdev -> x_pixels_per_inch = (35.0 * 140.0) / (float)DisplayInfo . PixelSpeed;
+ xdev -> y_pixels_per_inch = (xdev -> x_pixels_per_inch * (float)DisplayInfo . Resolution . x) / (float)DisplayInfo . Resolution . y;
+ }
+ else
+ {
+ xdev -> x_pixels_per_inch = 72.27;
+ xdev -> y_pixels_per_inch = 72.27;
+ }
+
+ if(xdev -> width > 0 && xdev -> height > 0)
+ {
+ xdev -> super_width = xdev -> width;
+ xdev -> super_height = xdev -> height;
+ }
+ else
+ {
+ if(xdev -> page_width > 0.0)
+ xdev -> super_width = (LONG)(xdev -> page_width * xdev -> x_pixels_per_inch);
+ else
+ xdev -> super_width = 640;
+
+ if(xdev -> page_height > 0.0)
+ xdev -> super_height = (LONG)(xdev -> page_height * xdev -> y_pixels_per_inch);
+ else
+ xdev -> super_height = 512;
+ }
+
+ /* Allocate a bitmap ready to be used for
+ * rendering.
+ */
+
+ if(xdev -> super_bitmap = CreateBitMap(xdev -> super_width,xdev -> super_height,Depth,BMF_DISPLAYABLE,DefaultScreen -> RastPort . BitMap,FALSE))
+ {
+ /* Clear the bitplanes. */
+
+ BltBitMap(xdev -> super_bitmap,0,0,xdev -> super_bitmap,0,0,xdev -> super_width,xdev -> super_height,0x00,(1 << xdev -> super_bitmap -> Depth) - 1,NULL);
+
+ /* Create the scroller handles. */
+
+ if(CreateScrollers(dev,DefaultScreen))
+ {
+ struct IBox ZoomBox;
+
+ /* Set up the window alternate
+ * position.
+ */
+
+ ZoomBox . Left = 0;
+ ZoomBox . Top = DefaultScreen -> BarHeight + 1;
+ ZoomBox . Width = ScreenWidth;
+ ZoomBox . Height = ScreenHeight - ZoomBox . Top;
+
+ /* Eventually, open the display window. */
+
+ if(xdev -> window = OpenWindowTags(NULL,
+ WA_InnerWidth, MIN(DefaultScreen -> Width / 2,xdev -> super_width),
+ WA_InnerHeight, MIN(DefaultScreen -> Height / 2,xdev -> super_height),
+ WA_CloseGadget, TRUE,
+ WA_DepthGadget, TRUE,
+ WA_SizeGadget, TRUE,
+ WA_SizeBRight, TRUE,
+ WA_SizeBBottom, TRUE,
+ WA_Zoom, &ZoomBox,
+ WA_DragBar, TRUE,
+ WA_NoCareRefresh, TRUE,
+ WA_GimmeZeroZero, TRUE,
+ WA_RMBTrap, TRUE,
+ WA_SuperBitMap, xdev -> super_bitmap,
+ WA_Gadgets, xdev -> gadget[VERTICAL_SCROLLER],
+ WA_CustomScreen, DefaultScreen,
+ WA_Title, "Ghostscript Amiga output window",
+ TAG_DONE))
+ {
+ if(xdev -> temp_rport = CreateTempRPort(xdev -> window -> RPort))
+ {
+ if(xdev -> temp_array = (UBYTE *)AllocVec((xdev -> window -> WScreen -> Width + 15) & ~15,MEMF_ANY))
+ {
+ struct Task *Task;
+
+ /* Bring the window dispatcher task
+ * to life...
+ */
+
+ if(Task = (struct Task *)CreateTask("Ghostscript window dispatcher",5,DispatchTask,8192))
+ {
+ const sigset_t trapped = sigmask(SIGINT);
+
+ /* Cheap... */
+
+ Task -> tc_UserData = dev;
+
+ /* Who's calling? */
+
+ xdev -> main = (struct Process *)FindTask(NULL);
+
+ /* Don't let anybody interrupt us! */
+
+ sigprocmask(SIG_BLOCK,&trapped,NULL);
+
+ Forbid();
+
+ /* Wake it up. */
+
+ Signal(Task,SIG_HANDSHAKE);
+
+ /* Clear the handshake bit. */
+
+ SetSignal(0,SIG_HANDSHAKE);
+
+ /* Wait for the report. */
+
+ Wait(SIG_HANDSHAKE);
+
+ Permit();
+
+ /* Get the result. */
+
+ Task = xdev -> dispatcher;
+
+ /* Unblock signals. */
+
+ sigprocmask(SIG_UNBLOCK,&trapped,NULL);
+ }
+
+ /* Did we succeed in creating
+ * the dispatcher task?
+ */
+
+ if(Task)
+ {
+ UWORD MaxValue = 0,
+ MinValue = 15000,
+ Value,
+ R,G,B;
+
+ /* Set the window limits. */
+
+ WindowLimits(xdev -> window,xdev -> window -> BorderLeft + MINIMUM_WIDTH + xdev -> window -> BorderRight,xdev -> window -> BorderTop + MINIMUM_HEIGHT + xdev -> window -> BorderBottom,xdev -> window -> BorderLeft + xdev -> super_width + xdev -> window -> BorderRight,xdev -> window -> BorderTop + xdev -> super_height + xdev -> window -> BorderBottom);
+
+ /* Update the sliders. */
+
+ WindowResize(dev);
+
+ /* Look for the darkest and the lightest screen colours. */
+
+ for(i = 0 ; i < MIN(xdev -> window -> WScreen -> ViewPort . ColorMap -> Count,(1 << Depth)) ; i++)
+ {
+ Value = GetRGB4(xdev -> window -> WScreen -> ViewPort . ColorMap,i);
+
+ R = (Value >> 8) & 0xF;
+ G = (Value >> 4) & 0xF;
+ B = Value & 0xF;
+
+ /* Luminance conversion included */
+
+ Value = R * 299 + G * 588 + B * 113;
+
+ if(Value > MaxValue)
+ {
+ MaxValue = Value;
+
+ LightPen = i;
+ }
+
+ if(Value < MinValue)
+ {
+ MinValue = Value;
+
+ DarkPen = i;
+ }
+ }
+
+ /* Fill in the rest. */
+
+ xdev -> width = xdev -> super_width;
+ xdev -> height = xdev -> super_height;
+ xdev -> rport = xdev -> window -> RPort;
+
+ /* Does the display support
+ * at least eight colours?
+ */
+
+ if(Depth >= 3)
+ {
+ LONG cube_size,max;
+
+ /* Set up a fitting colour cube. */
+
+ for(cube_size = 6 ; cube_size >= 2 ; cube_size--)
+ {
+ if((max = cube_size * cube_size * cube_size) <= 1 << Depth)
+ break;
+ }
+
+ /* Got enough colours? */
+
+ if(cube_size != 1)
+ {
+ LONG *Pens;
+
+ /* Try to grab the cube colours,
+ * making a colour display.
+ */
+
+ if(Pens = AllocatePens(&xdev -> window -> WScreen -> ViewPort,cube_size))
+ set_colour_device((gx_device_amiga *)dev,cube_size,Pens);
+ }
+ }
+
+ SetBPen(xdev -> rport,0);
+ SetDrMd(xdev -> rport,JAM2);
+
+ amiga_set_pen(dev,DarkPen);
+
+ UnlockPubScreen(NULL,DefaultScreen);
+
+ return(0);
+ }
+ else
+ perror("Ghostscript: failed to create dispatcher task");
+ }
+ else
+ perror("Ghostscript: failed to create temporary line buffer.");
+ }
+ else
+ perror("Ghostscript: failed to create temporary raster port");
+ }
+ else
+ perror("Ghostscript: failed to open window");
+ }
+ else
+ perror("Ghostscript: failed to allocate scrollers");
+ }
+ else
+ perror("Ghostscript: failed to allocate bitmap");
+ }
+ else
+ perror("Ghostscript: failed to get display mode information");
+
+ UnlockPubScreen(NULL,DefaultScreen);
+ }
+ else
+ perror("Ghostscript: failed to lock default public screen");
+
+ return(-1);
+ }
+
+ /* amiga_open_low(gx_device *dev):
+ *
+ * Open the low resolution device.
+ */
+
+ int
+ amiga_open_low(gx_device *dev)
+ {
+ return(amiga_open(dev,LORES_KEY));
+ }
+
+ /* amiga_open_high(gx_device *dev):
+ *
+ * Open the high resolution device.
+ */
+
+ int
+ amiga_open_high(gx_device *dev)
+ {
+ return(amiga_open(dev,HIRESLACE_KEY));
+ }
+
+ /* amiga_open_super(gx_device *dev):
+ *
+ * Open the super high resolution device.
+ */
+
+ int
+ amiga_open_super(gx_device *dev)
+ {
+ /* Fall back to the default if not available. */
+
+ if(ModeNotAvailable(SUPERLACE_KEY))
+ return(amiga_open_high(dev));
+ else
+ return(amiga_open(dev,SUPERLACE_KEY));
+ }
+
+ /* amiga_open_a2024(gx_device *dev):
+ *
+ * Open the A2024 device.
+ */
+
+ int
+ amiga_open_a2024(gx_device *dev)
+ {
+ /* Fall back to the default if not available. */
+
+ if(ModeNotAvailable(A2024TENHERTZ_KEY))
+ return(amiga_open_super(dev));
+ else
+ return(amiga_open(dev,A2024TENHERTZ_KEY));
+ }
+
+ /* amiga_open_picassoii(gx_device *dev):
+ *
+ * Open the Picasso II device.
+ */
+
+ int
+ amiga_open_picassoii(gx_device *dev)
+ {
+ /* Fall back to the default if not available. */
+
+ if(ModeNotAvailable(0x40020002))
+ return(amiga_open_super(dev));
+ else
+ return(amiga_open(dev,0x40020002));
+ }
+
+ int
+ amiga_open_custom(gx_device *dev)
+ {
+ UBYTE Buffer[256];
+ ULONG ScreenID = INVALID_ID;
+ BOOL DontTouch = FALSE;
+
+ /* First step: check for an environment variable to give
+ * the name of the display mode to use.
+ */
+
+ if(GetVar("GSCUSTOMMODE",Buffer,256,NULL) != -1)
+ {
+ UBYTE PatternBuffer[516];
+
+ /* Set up the search pattern. */
+
+ if(ParsePatternNoCase(Buffer,PatternBuffer,516) >= 0)
+ {
+ ULONG CurrentID = INVALID_ID,ID;
+
+ /* Scan the entire list. */
+
+ while((CurrentID = NextDisplayInfo(CurrentID)) != INVALID_ID)
+ {
+ /* Valid mode? */
+
+ if(!ModeNotAvailable(CurrentID))
+ {
+ struct NameInfo NameInfo;
+
+ /* Get the name information. */
+
+ if(GetDisplayInfoData(NULL,&NameInfo,sizeof(struct NameInfo),DTAG_NAME,CurrentID))
+ {
+ /* Does the mode name match the pattern given? */
+
+ if(MatchPatternNoCase(PatternBuffer,NameInfo . Name))
+ {
+ ScreenID = CurrentID;
+
+ /* Don't overwrite the variable contents. */
+
+ DontTouch = TRUE;
+
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if(ScreenID == INVALID_ID && AslBase)
+ {
+ struct ScreenModeRequester *ScreenModeRequester;
+
+ if(ScreenModeRequester = (struct ScreenModeRequester *)AllocAslRequestTags(ASL_ScreenModeRequest,TAG_DONE))
+ {
+ if(AslRequestTags(ScreenModeRequester,
+ ASLSM_TitleText, "Select GhostScript screen display mode",
+ ASLSM_MinDepth, 1,
+ ASLSM_MaxDepth, 8,
+ TAG_DONE))
+ ScreenID = ScreenModeRequester -> sm_DisplayID;
+
+ FreeAslRequest(ScreenModeRequester);
+ }
+ }
+
+ /* Fall back to the default if not available. */
+
+ if(ModeNotAvailable(ScreenID))
+ return(amiga_open_default(dev));
+ else
+ {
+ int result = amiga_open(dev,ScreenID);
+
+ /* If successful store the name of the
+ * screen mode selected.
+ */
+
+ if(!result && !DontTouch)
+ {
+ struct NameInfo NameInfo;
+
+ if(GetDisplayInfoData(NULL,&NameInfo,sizeof(struct NameInfo),DTAG_NAME,ScreenID))
+ SetVar("GSCUSTOMMODE",NameInfo . Name,-1,NULL);
+ }
+
+ return(result);
+ }
+ }
+
+ /* amiga_open_printer(gx_device *dev):
+ *
+ * Open the printer device.
+ */
+
+ int
+ amiga_open_printer(gx_device *dev)
+ {
+ if(xdev -> port = CreateMsgPort())
+ {
+ if(xdev -> printer = (struct IODRPReq *)CreateIORequest(xdev -> port,sizeof(struct IODRPReq)))
+ {
+ if(!OpenDevice("printer.device",0,(struct IORequest *)xdev -> printer,0))
+ {
+ if(xdev -> rport = (struct RastPort *)AllocVec(sizeof(struct RastPort),MEMF_ANY))
+ {
+ const sigset_t trapped = sigmask(SIGINT);
+ struct BitMap DummyBitMap;
+ UWORD DummyLine[12];
+
+ InitRastPort(xdev -> rport);
+
+ /* Cook up a dummy bitmap to keep
+ * `smart' drivers from complaining.
+ */
+
+ InitBitMap(&DummyBitMap,12,16,16);
+
+ DummyBitMap . Planes[0] = (PLANEPTR)&DummyLine;
+
+ xdev -> rport -> BitMap = &DummyBitMap;
+
+ /* Query page size requirements. */
+
+ xdev -> printer -> io_Command = PRD_DUMPRPORT;
+ xdev -> printer -> io_RastPort = xdev -> rport;
+ xdev -> printer -> io_SrcWidth = 16;
+ xdev -> printer -> io_SrcHeight = 16;
+ xdev -> printer -> io_Modes = LORES_KEY;
+
+ xdev -> printer -> io_Special |= SPECIAL_FULLCOLS | SPECIAL_FULLROWS | SPECIAL_NOPRINT;
+
+ /* Don't let them stop us now! */
+
+ sigprocmask(SIG_BLOCK,&trapped,NULL);
+
+ /* Ask for it... */
+
+ if(!DoIO((struct IORequest *)xdev -> printer))
+ {
+ struct PrinterExtendedData *PED;
+ struct PrinterData *PD;
+ struct Preferences *Prefs;
+ LONG Depth,
+ NumColours,
+ CubeSize;
+ LONG PageWidth,
+ PageHeight;
+
+ /* Unblock ^C signal. */
+
+ sigprocmask(SIG_UNBLOCK,&trapped,NULL);
+
+ xdev -> printer -> io_Special &= ~(SPECIAL_FULLCOLS | SPECIAL_FULLROWS | SPECIAL_NOPRINT);
+
+ /* Get the printer internal data. */
+
+ PD = (struct PrinterData *)xdev -> printer -> io_Device;
+ PED = &PD -> pd_SegmentData -> ps_PED;
+ Prefs = &PD -> pd_Preferences;
+
+ /* Calculate the printer page size. */
+
+ PageWidth = PED -> ped_XDotsInch * (Prefs -> PrintRightMargin - Prefs -> PrintLeftMargin + 1);
+ PageHeight = PED -> ped_YDotsInch * Prefs -> PaperLength;
+
+ switch(Prefs -> PrintPitch)
+ {
+ case PICA:
+
+ PageWidth /= 10;
+ break;
+
+ case ELITE:
+
+ PageWidth /= 12;
+ break;
+
+ case FINE:
+
+ PageWidth /= 15;
+ break;
+ }
+
+ switch(Prefs -> PrintSpacing)
+ {
+ case SIX_LPI:
+
+ PageHeight /= 6;
+ break;
+
+ case EIGHT_LPI:
+
+ PageHeight /= 8;
+ break;
+ }
+
+ if(PageWidth > PED -> ped_MaxXDots)
+ PageWidth = PED -> ped_MaxXDots;
+
+ if(PageHeight > PED -> ped_MaxYDots && PED -> ped_MaxYDots)
+ PageHeight = PED -> ped_MaxYDots;
+
+ /* Set up the default colour values. */
+
+ if(Prefs -> PrintShade == SHADE_BW)
+ {
+ Depth = 1;
+ NumColours = 2;
+ CubeSize = 0;
+ }
+ else
+ {
+ Depth = 12;
+ NumColours = 4096;
+ CubeSize = 16;
+ }
+
+ /* Get the page size */
+
+ if(xdev -> width > 0 && xdev -> height > 0)
+ {
+ if(PageWidth < xdev -> width)
+ xdev -> width = PageWidth;
+
+ if(PageHeight < xdev -> height)
+ xdev -> height = PageHeight;
+ }
+ else
+ {
+ xdev -> width = PageWidth;
+ xdev -> height = PageHeight;
+ }
+
+ /* Get the DPI values */
+
+ xdev -> x_pixels_per_inch = (float)PED -> ped_XDotsInch;
+ xdev -> y_pixels_per_inch = (float)PED -> ped_YDotsInch;
+
+ /* Try to allocate a suitable bitmap.
+ * If an allocation fails, rescale the
+ * colour cube and bitmap depth and
+ * retry. Minimum are eight colours.
+ */
+
+ do
+ {
+ /* Try to allocate the raster... */
+
+ if(!(xdev -> bitmap = CreateBitMap(xdev -> width,xdev -> height,Depth,NULL,NULL,TRUE)))
+ {
+ /* Any chance to rescale the cube? */
+
+ if(Depth < 2)
+ break;
+ else
+ {
+ /* One plane less... */
+
+ Depth--;
+
+ /* Rescale the cube. */
+
+ while(CubeSize >= 2)
+ {
+ if((NumColours = CubeSize * CubeSize * CubeSize) <= (1 << Depth))
+ break;
+ else
+ CubeSize--;
+ }
+
+ /* Less than eight colours? */
+
+ if(CubeSize < 2)
+ break;
+ }
+ }
+ }
+ while(!xdev -> bitmap);
+
+ /* Got the bitmap? */
+
+ if(xdev -> bitmap)
+ {
+ /* Allocate a suitable colour map. */
+
+ if(xdev -> colormap = GetColorMap(NumColours))
+ {
+ /* Black & white only? */
+
+ if(NumColours == 2)
+ {
+ SetRGB4CM(xdev -> colormap,0,0x0,0x0,0x0);
+ SetRGB4CM(xdev -> colormap,1,0xF,0xF,0xF);
+ }
+ else
+ {
+ LONG i = 0,r,g,b,max = CubeSize - 1;
+
+ /* Fill in the colour cube. */
+
+ for(r = 0 ; r < CubeSize ; r++)
+ {
+ for(g = 0 ; g < CubeSize ; g++)
+ {
+ for(b = 0 ; b < CubeSize ; b++)
+ SetRGB4CM(xdev -> colormap,i++,(15 * r) / max,(15 * g) / max,(15 * b) / max);
+ }
+ }
+
+ set_colour_printer_device((gx_device_amiga *)dev,CubeSize);
+ }
+
+ xdev -> printer -> io_ColorMap = xdev -> colormap;
+ xdev -> rport -> BitMap = xdev -> bitmap;
+
+ return(0);
+ }
+ else
+ perror("Ghostscript: failed to allocate colour map");
+ }
+ else
+ {
+ char buffer[256];
+
+ sprintf(buffer,"Ghostscript: failed to allocate raster (wanted %ld, largest %ld)",(xdev -> width + 15) / 8 * xdev -> height * Depth,AvailMem(MEMF_ANY | MEMF_LARGEST));
+
+ perror(buffer);
+ }
+ }
+ else
+ {
+ char buffer[256];
+
+ sigprocmask(SIG_UNBLOCK,&trapped,NULL);
+
+ sprintf(buffer,"Ghostscript: failed to query printer page size (error code #%ld)",xdev -> printer -> io_Error);
+
+ perror(buffer);
+ }
+ }
+ else
+ perror("Ghostscript: failed to allocate raster port");
+ }
+ else
+ {
+ char buffer[256];
+
+ sprintf(buffer,"Ghostscript: failed to open printer.device (error code #%ld)",xdev -> printer -> io_Error);
+
+ perror(buffer);
+ }
+ }
+ else
+ perror("Ghostscript: failed to allocate device driver");
+ }
+ else
+ perror("Ghostscript: failed to create io port");
+
+ return(-1);
+ }
+
+ /* amiga_output_page_printer(gx_device *dev,int,int):
+ *
+ * Send a bitmap to the printer.
+ */
+
+ int
+ amiga_output_page_printer(gx_device *dev,int num_copies,int flush)
+ {
+ const sigset_t trapped = sigmask(SIGINT);
+ int result,i;
+ ULONG Signals;
+
+ xdev -> printer -> io_Command = PRD_DUMPRPORT;
+ xdev -> printer -> io_SrcWidth = xdev -> width;
+ xdev -> printer -> io_SrcHeight = xdev -> height;
+ xdev -> printer -> io_DestCols = xdev -> width;
+ xdev -> printer -> io_DestRows = xdev -> height;
+
+ /* We cannot possibly allow being interrupted in the middle
+ * of a raster dump!
+ */
+
+ sigprocmask(SIG_BLOCK,&trapped,NULL);
+
+ for(i = 0 ; i < num_copies ; i++)
+ {
+ SetSignal(0,SIGBREAKF_CTRL_C | (1L << xdev -> port -> mp_SigBit));
+
+ SendIO((struct IORequest *)xdev -> printer);
+
+ Signals = Wait(SIGBREAKF_CTRL_C | (1L << xdev -> port -> mp_SigBit));
+
+ if(Signals & SIGBREAKF_CTRL_C)
+ {
+ char buffer[256];
+
+ if(!CheckIO((struct IORequest *)xdev -> printer))
+ AbortIO((struct IORequest *)xdev -> printer);
+
+ WaitIO((struct IORequest *)xdev -> printer);
+
+ sprintf(buffer,"Ghostscript: printing aborted");
+
+ perror(buffer);
+
+ result = -1;
+
+ sigprocmask(SIG_UNBLOCK,&trapped,NULL);
+
+ break;
+ }
+
+ if(Signals & (1L << xdev -> port -> mp_SigBit))
+ {
+ if(WaitIO((struct IORequest *)xdev -> printer))
+ {
+ char buffer[256];
+
+ sprintf(buffer,"Ghostscript: failed to print raster (error code #%ld)",xdev -> printer -> io_Error);
+
+ perror(buffer);
+
+ result = -1;
+
+ sigprocmask(SIG_UNBLOCK,&trapped,NULL);
+
+ break;
+ }
+ else
+ result = 0;
+ }
+ }
+
+ sigprocmask(SIG_UNBLOCK,&trapped,NULL);
+
+ return(result);
+ }
+
+ /* amiga_close_printer(gx_device *dev):
+ *
+ * Close the printer driver.
+ */
+
+ int
+ amiga_close_printer(gx_device *dev)
+ {
+ if(xdev -> bitmap)
+ {
+ DeleteBitMap(xdev -> bitmap,TRUE);
+
+ xdev -> bitmap = NULL;
+ }
+
+ if(xdev -> rport)
+ {
+ FreeVec(xdev -> rport);
+
+ xdev -> rport = NULL;
+ }
+
+ if(xdev -> colormap)
+ {
+ FreeColorMap(xdev -> colormap);
+
+ xdev -> colormap = NULL;
+ }
+
+ if(xdev -> printer)
+ {
+ if(xdev -> printer -> io_Device)
+ CloseDevice((struct IORequest *)xdev -> printer);
+
+ DeleteIORequest(xdev -> printer);
+
+ xdev -> printer = NULL;
+ }
+
+ if(xdev -> port)
+ {
+ DeleteMsgPort(xdev -> port);
+
+ xdev -> port = NULL;
+ }
+
+ xdev -> width = xdev -> height = 0;
+ /* xdev -> x_pixels_per_inch = x_pixels_per_inch = 72.72;*/
+
+ return(0);
+ }
+
+ /* amiga_get_bits(gx_device *dev,int y,byte *str,byte **actual_data):
+ *
+ * Read the raster bits into a buffer.
+ */
+
+ int
+ amiga_get_bits(gx_device *dev,int y,byte *str,byte **actual_data)
+ {
+ if(y < 0 || y > xdev -> height)
+ return(-1);
+ else
+ {
+ if(actual_data)
+ *actual_data = (byte *)(xdev -> bitmap -> Planes[0] + xdev -> bitmap -> BytesPerRow * y);
+ else
+ memcpy(str,xdev -> bitmap -> Planes[0] + xdev -> bitmap -> BytesPerRow * y,xdev -> bitmap -> BytesPerRow);
+
+ return(0);
+ }
+ }
+
+ /* amiga_open(gx_device *dev,ULONG Mode):
+ *
+ * Open a custom screen.
+ */
+
+ int
+ amiga_open(gx_device *dev,ULONG Mode)
+ {
+ struct DisplayInfo DisplayInfo;
+ struct DimensionInfo DimensionInfo;
+
+ /* Get the display dimensions. */
+
+ if(GetDisplayInfoData(NULL,(APTR)&DisplayInfo,sizeof(struct DisplayInfo),DTAG_DISP,Mode) && GetDisplayInfoData(NULL,(APTR)&DimensionInfo,sizeof(struct DimensionInfo),DTAG_DIMS,Mode))
+ {
+ /* Two shades only, black & white */
+
+ STATIC struct ColorSpec Colours[] =
+ {
+ 0, 0x0000, 0x0000, 0x0000,
+ 1, 0xFFFF, 0xFFFF, 0xFFFF,
+
+ -1
+ };
+
+ float Width,
+ Height;
+ LONG i,cube_size,max;
+ LONG ScreenWidth,
+ ScreenHeight,
+ ScreenDepth;
+
+ /* Start up with a maximum depth display. */
+
+ ScreenDepth = DimensionInfo . MaxDepth;
+
+ /* Check to see whether we will be able to
+ * build a colour display or not.
+ */
+
+ for(cube_size = 6 ; cube_size >= 2 ; cube_size--)
+ {
+ if((max = cube_size * cube_size * cube_size) <= 1 << ScreenDepth)
+ break;
+ }
+
+ /* Got enough colours? */
+
+ if(cube_size != 1)
+ set_colour_device((gx_device_amiga *)dev,cube_size,NULL);
+ else
+ {
+ ScreenDepth = 1;
+
+ set_mono_device((gx_device_amiga *)dev);
+ }
+
+ if(xdev -> width > 0 && xdev -> height > 0)
+ {
+ Width = xdev -> width;
+ Height = xdev -> height;
+ }
+ else
+ {
+ if(xdev -> page_width > 0.0)
+ Width = xdev -> page_width;
+ else
+ Width = 0.0;
+
+ if(xdev -> page_height > 0.0)
+ Height = xdev -> page_height;
+ else
+ Height = 0.0;
+ }
+
+ /* Use the best guess, we will take the standard
+ * low resolution x-dpi value and scale it by
+ * the pixel speed.
+ */
+
+ if(DisplayInfo . PixelSpeed)
+ {
+ xdev -> x_pixels_per_inch = (35.0 * 140.0) / (float)DisplayInfo . PixelSpeed;
+ xdev -> y_pixels_per_inch = (xdev -> x_pixels_per_inch * (float)DisplayInfo . Resolution . x) / (float)DisplayInfo . Resolution . y;
+ }
+ else
+ {
+ xdev -> x_pixels_per_inch = 72.27;
+ xdev -> y_pixels_per_inch = 72.27;
+ }
+
+ if(Width > 0.0)
+ ScreenWidth = (LONG)(Width * xdev -> x_pixels_per_inch);
+ else
+ ScreenWidth = 0;
+
+ if(Height > 0.0)
+ ScreenHeight = (LONG)(Height * xdev -> y_pixels_per_inch);
+ else
+ ScreenHeight = 0;
+
+ if(ScreenWidth < DimensionInfo . MinRasterWidth || ScreenWidth > DimensionInfo . MaxRasterWidth)
+ ScreenWidth = 0;
+
+ if(ScreenHeight < DimensionInfo . MinRasterHeight || ScreenHeight > DimensionInfo . MaxRasterHeight)
+ ScreenHeight = 0;
+
+ /* Try to open a custom screen; if this fails, try to
+ * rescale the colour cube and retry.
+ */
+
+ do
+ {
+ if(!(xdev -> screen = OpenScreenTags(NULL,
+ SA_Depth, ScreenDepth,
+ SA_Overscan, OSCAN_TEXT,
+ SA_Quiet, TRUE,
+ SA_Behind, TRUE,
+ SA_DisplayID, Mode,
+ SA_Colors, Colours,
+ SA_AutoScroll, TRUE,
+ SA_ShowTitle, FALSE,
+ SA_Title, "Ghostscript Amiga output screen",
+
+ ScreenWidth > 0 ? SA_Width : TAG_IGNORE, ScreenWidth,
+ ScreenHeight > 0 ? SA_Height : TAG_IGNORE, ScreenHeight,
+ TAG_DONE)))
+ {
+ if(ScreenDepth < 2)
+ break;
+ else
+ {
+ ScreenDepth--;
+
+ /* Check to see whether we will be able to
+ * build a colour display or not.
+ */
+
+ while(cube_size >= 2)
+ {
+ if((max = cube_size * cube_size * cube_size) <= 1 << ScreenDepth)
+ break;
+ else
+ cube_size--;
+ }
+
+ /* Got enough colours? */
+
+ if(cube_size == 1 || ScreenDepth == 1)
+ {
+ /* Obviously not. */
+
+ ScreenDepth = 1;
+
+ set_mono_device((gx_device_amiga *)dev);
+ }
+ }
+ }
+ }
+ while(!xdev -> screen);
+
+ /* Did we succeed in opening the screen? */
+
+ if(xdev -> screen)
+ {
+ if(xdev -> window = OpenWindowTags(NULL,
+ WA_Left, 0,
+ WA_Top, 0,
+ WA_Width, xdev -> screen -> Width,
+ WA_Height, xdev -> screen -> Height,
+ WA_Backdrop, TRUE,
+ WA_RMBTrap, TRUE,
+ WA_Borderless, TRUE,
+ WA_CustomScreen,xdev -> screen,
+ TAG_DONE))
+ {
+ xdev -> rport = xdev -> window -> RPort;
+ xdev -> width = xdev -> screen -> Width;
+ xdev -> height = xdev -> screen -> Height;
+ }
+ else
+ {
+ xdev -> rport = &xdev -> screen -> RastPort;
+ xdev -> width = xdev -> screen -> Width;
+ xdev -> height = xdev -> screen -> Height;
+ }
+
+ /* Establish defaults. */
+
+ DarkPen = 0;
+ LightPen = 1;
+
+ SetBPen(xdev -> rport,0);
+ SetDrMd(xdev -> rport,JAM2);
+
+ /* Create the temporary drawing area. */
+
+ if(xdev -> temp_rport = CreateTempRPort(xdev -> rport))
+ {
+ if(xdev -> temp_array = (UBYTE *)AllocVec((xdev -> screen -> Width + 15) & ~15,MEMF_ANY))
+ {
+ /* Colour output enabled? */
+
+ if(xdev -> cube_size > 0)
+ {
+ LONG r,g,b,max = xdev -> cube_size - 1;
+
+ i = 0;
+
+ /* Build a suitable colour map. */
+
+ if(GfxBase -> LibNode . lib_Version >= 39)
+ {
+ for(r = 0 ; r < xdev -> cube_size ; r++)
+ {
+ for(g = 0 ; g < xdev -> cube_size ; g++)
+ {
+ for(b = 0 ; b < xdev -> cube_size ; b++)
+ SetRGB32(&xdev -> screen -> ViewPort,i++,SPREAD((255 * r) / max),SPREAD((255 * g) / max),SPREAD((255 * b) / max));
+ }
+ }
+ }
+ else
+ {
+ for(r = 0 ; r < xdev -> cube_size ; r++)
+ {
+ for(g = 0 ; g < xdev -> cube_size ; g++)
+ {
+ for(b = 0 ; b < xdev -> cube_size ; b++)
+ SetRGB4(&xdev -> screen -> ViewPort,i++,(15 * r) / max,(15 * g) / max,(15 * b) / max);
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ perror("Ghostscript: failed to allocate temporary line");
+
+ return(-1);
+ }
+ }
+ else
+ {
+ perror("Ghostscript: failed to allocate temporary raster");
+
+ return(-1);
+ }
+
+ amiga_set_pen(dev,DarkPen);
+
+ return(0);
+ }
+ else
+ perror("Ghostscript: failed to open screen");
+ }
+ else
+ perror("Ghostscript: failed to get display mode information");
+
+ return(-1);
+ }
+
+ /* amiga_output_page(gx_device *dev,int,int):
+ *
+ * Page is not `buffered', just bring screen/window
+ * to the front.
+ */
+
+ int
+ amiga_output_page(gx_device *dev,int num_copies,int flush)
+ {
+ if(xdev -> screen)
+ ScreenToFront(xdev -> screen);
+ else
+ {
+ if(xdev -> window)
+ WindowToFront(xdev -> window);
+ }
+
+ return(0);
+ }
+
+ /* amiga_close(gx_device *dev):
+ *
+ * Close the screen and free associated resources.
+ */
+
+ int
+ amiga_close(gx_device *dev)
+ {
+ if(xdev -> dispatcher)
+ {
+ const sigset_t trapped = sigmask(SIGINT);
+
+ sigprocmask(SIG_BLOCK,&trapped,NULL);
+
+ Forbid();
+
+ Signal(xdev -> dispatcher,SIG_KILL);
+
+ SetSignal(0,SIG_HANDSHAKE);
+
+ Wait(SIG_HANDSHAKE);
+
+ Permit();
+
+ sigprocmask(SIG_UNBLOCK,&trapped,NULL);
+ }
+
+ if(xdev -> temp_array)
+ {
+ FreeVec(xdev -> temp_array);
+
+ xdev -> temp_array = NULL;
+ }
+
+ if(xdev -> pens)
+ {
+ LONG i;
+
+ for(i = 0 ; i < xdev -> cube_size * xdev -> cube_size * xdev -> cube_size ; i++)
+ {
+ if(xdev -> pens[i] != -1)
+ ReleasePen(xdev -> window -> WScreen -> ViewPort . ColorMap,xdev -> pens[i]);
+ }
+
+ FreeVec(xdev -> pens);
+
+ xdev -> pens = NULL;
+ }
+
+ if(xdev -> temp_rport)
+ {
+ DeleteTempRPort(xdev -> temp_rport);
+
+ xdev -> temp_rport = NULL;
+ }
+
+ if(xdev -> window)
+ {
+ CloseWindow(xdev -> window);
+
+ xdev -> window = NULL;
+ }
+
+ DeleteScrollers(dev);
+
+ if(xdev -> super_bitmap)
+ {
+ DeleteBitMap(xdev -> super_bitmap,FALSE);
+
+ xdev -> super_bitmap = NULL;
+ }
+
+ if(xdev -> screen)
+ {
+ CloseScreen(xdev -> screen);
+
+ xdev -> screen = NULL;
+ }
+
+ xdev -> width = xdev -> height = 0;
+ /* xdev -> x_pixels_per_inch = x_pixels_per_inch = 72.72;*/
+
+ return(0);
+ }
+
+ /* amiga_fill_rectangle(gx_device *dev,int x,int y,int w,int h,gx_color_index color):
+ *
+ * Fill a rectangle with a given colour. This one is simple as it can
+ * be done with the Amiga graphics primitives.
+ */
+
+ int
+ amiga_fill_rectangle(gx_device *dev,int x,int y,int w,int h,gx_color_index color)
+ {
+ if(x < 0 || x > xdev -> width - w || y < 0 || y > xdev -> height - h)
+ return(-1);
+ else
+ {
+ if(w > 0 && h > 0 && color != gx_no_color_index)
+ {
+ amiga_set_pen(dev,color);
+
+ RectFill(xdev -> rport,x,y,x + w - 1,y + h - 1);
+ }
+
+ return(0);
+ }
+ }
+
+ /* amiga_copy_mono():
+ *
+ * Copy a monochrome image. This operation requires a bit of work as
+ * we cannot simply blit the image into the bitmap.
+ */
+
+ int
+ amiga_copy_mono(gx_device *dev,const UBYTE *base,int sourcex,int raster,gx_bitmap_id id,int x,int y,int w,int h,gx_color_index zero,gx_color_index one)
+ {
+ if(y < 0 || x < 0 || w < 0 || h < 0)
+ return(-1);
+ else
+ {
+ if(w > 0 && h > 0)
+ {
+ LONG i,j;
+
+ if(zero == gx_no_color_index)
+ {
+ if(one != gx_no_color_index)
+ {
+ do
+ {
+ ReadPixelLine8(xdev -> rport,x,y,w,xdev -> temp_array,xdev -> temp_rport);
+
+ for(i = sourcex, j = 0 ; i < sourcex + w ; i++, j++)
+ {
+ if(base[i >> 3] & shift[i & 7])
+ xdev -> temp_array[j] = one;
+ }
+
+ WritePixelLine8(xdev -> rport,x,y,w,xdev -> temp_array,xdev -> temp_rport);
+
+ base += raster;
+
+ y++;
+ }
+ while(--h);
+ }
+ }
+ else
+ {
+ if(one == gx_no_color_index)
+ {
+ do
+ {
+ ReadPixelLine8(xdev -> rport,x,y,w,xdev -> temp_array,xdev -> temp_rport);
+
+ for(i = sourcex, j = 0 ; i < w + sourcex ; i++, j++)
+ {
+ if(!(base[i >> 3] & shift[i & 7]))
+ xdev -> temp_array[j] = zero;
+ }
+
+ WritePixelLine8(xdev -> rport,x,y,w,xdev -> temp_array,xdev -> temp_rport);
+
+ base += raster;
+
+ y++;
+ }
+ while(--h);
+ }
+ else
+ {
+ do
+ {
+ for(i = sourcex, j = 0 ; i < w + sourcex ; i++, j++)
+ {
+ if(base[i >> 3] & shift[i & 7])
+ xdev -> temp_array[j] = one;
+ else
+ xdev -> temp_array[j] = zero;
+ }
+
+ WritePixelLine8(xdev -> rport,x,y,w,xdev -> temp_array,xdev -> temp_rport);
+
+ base += raster;
+
+ y++;
+ }
+ while(--h);
+ }
+ }
+ }
+
+ return(0);
+ }
+ }
+
+ /* amiga_copy_color():
+ *
+ * Copy a color image (oh well...). This is just the same as the
+ * copy_mono() routine.
+ */
+
+ int
+ amiga_copy_color(gx_device *dev,const UBYTE *base,int sourcex,int raster,gx_bitmap_id id,int x,int y,int w,int h)
+ {
+ if(y < 0 || x < 0 || w < 0 || h < 0)
+ return(-1);
+ else
+ {
+ if(w > 0 && h > 0)
+ {
+ LONG i,j;
+
+ do
+ {
+ for(i = sourcex, j = 0 ; i < w + sourcex ; i++, j++)
+ {
+ if(base[i >> 3] & shift[i & 7])
+ xdev -> temp_array[j] = DarkPen;
+ else
+ xdev -> temp_array[j] = LightPen;
+ }
+
+ WritePixelLine8(xdev -> rport,x,y,w,xdev -> temp_array,xdev -> temp_rport);
+
+ base += raster;
+
+ y++;
+ }
+ while(--h);
+ }
+
+ return(0);
+ }
+ }
+
+ /* amiga_draw_line(gx_device *dev,int x0,int y0,int x1,int y1,gx_color_index color):
+ *
+ * Draw a line between two points. This one is easy as it can be done
+ * with the Amiga graphics primitives, the only glitch is having to reset
+ * the last dot to its original colour.
+ */
+
+ int
+ amiga_draw_line(gx_device *dev,int x0,int y0,int x1,int y1,gx_color_index color)
+ {
+ if(color != gx_no_color_index && (x0 != x1 || y0 != y1))
+ {
+ LONG pen;
+
+ pen = ReadPixel(xdev -> rport,x1,y1);
+
+ amiga_set_pen(dev,color);
+
+ Move(xdev -> rport,x0,y0);
+ Draw(xdev -> rport,x1,y1);
+
+ if(pen == color)
+ {
+ amiga_set_pen(dev,pen);
+
+ WritePixel(xdev -> rport,x1,y1);
+ }
+ }
+
+ return(0);
+ }
+
+ /* amiga_copy_mono_raw():
+ *
+ * Copy a monochrome image to a bitmap. Just watch the
+ * astounding number of case switches.
+ */
+
+ int
+ amiga_copy_mono_raw(gx_device *dev,const UBYTE *base,int sourcex,int raster,gx_bitmap_id id,int x,int y,int w,int h,gx_color_index zero,gx_color_index one)
+ {
+ if(y < 0 || x < 0 || w < 0 || h < 0)
+ return(-1);
+ else
+ {
+ if(w > 0 && h > 0)
+ {
+ LONG i,j,modulo = xdev -> rport -> BitMap -> BytesPerRow;
+ UBYTE *line;
+
+ w += sourcex;
+
+ line = xdev -> rport -> BitMap -> Planes[0] + y * xdev -> rport -> BitMap -> BytesPerRow;
+
+ if(zero == gx_no_color_index)
+ {
+ if(one != gx_no_color_index)
+ {
+ if(one)
+ {
+ do
+ {
+ for(i = sourcex, j = x ; i < w ; i++, j++)
+ {
+ if(base[i >> 3] & shift[i & 7])
+ line[j >> 3] |= shift[j & 7];
+ }
+
+ base += raster;
+
+ line += modulo;
+ }
+ while(--h);
+ }
+ else
+ {
+ do
+ {
+ for(i = sourcex, j = x ; i < w ; i++, j++)
+ {
+ if(base[i >> 3] & shift[i & 7])
+ line[j >> 3] &= masks[j & 7];
+ }
+
+ base += raster;
+
+ line += modulo;
+ }
+ while(--h);
+ }
+ }
+ }
+ else
+ {
+ if(one == gx_no_color_index)
+ {
+ if(zero)
+ {
+ do
+ {
+ for(i = sourcex, j = x ; i < w ; i++, j++)
+ {
+ if(!(base[i >> 3] & shift[i & 7]))
+ line[j >> 3] |= shift[j & 7];
+ }
+
+ base += raster;
+
+ line += modulo;
+ }
+ while(--h);
+ }
+ else
+ {
+ do
+ {
+ for(i = sourcex, j = x ; i < w ; i++, j++)
+ {
+ if(!(base[i >> 3] & shift[i & 7]))
+ line[j >> 3] &= masks[j & 7];
+ }
+
+ base += raster;
+
+ line += modulo;
+ }
+ while(--h);
+ }
+ }
+ else
+ {
+ if(one)
+ {
+ do
+ {
+ for(i = sourcex, j = x ; i < w ; i++, j++)
+ {
+ if(base[i >> 3] & shift[i & 7])
+ line[j >> 3] |= shift[j & 7];
+ else
+ line[j >> 3] &= masks[j & 7];
+ }
+
+ base += raster;
+
+ line += modulo;
+ }
+ while(--h);
+ }
+ else
+ {
+ do
+ {
+ for(i = sourcex, j = x ; i < w ; i++, j++)
+ {
+ if(base[i >> 3] & shift[i & 7])
+ line[j >> 3] &= masks[j & 7];
+ else
+ line[j >> 3] |= shift[j & 7];
+ }
+
+ base += raster;
+
+ line += modulo;
+ }
+ while(--h);
+ }
+ }
+ }
+ }
+
+ return(0);
+ }
+ }
+
+ /* amiga_copy_color_raw():
+ *
+ * Copy a color image (oh well...). This is just the same as the
+ * copy_mono() routine.
+ */
+
+ int
+ amiga_copy_color_raw(gx_device *dev,const UBYTE *base,int sourcex,int raster,gx_bitmap_id id,int x,int y,int w,int h)
+ {
+ if(y < 0 || x < 0 || w < 0 || h < 0)
+ return(-1);
+ else
+ {
+ if(w > 0 && h > 0)
+ {
+ LONG i,j,modulo = xdev -> rport -> BitMap -> BytesPerRow;
+ UBYTE *line;
+
+ line = xdev -> rport -> BitMap -> Planes[0] + y * xdev -> rport -> BitMap -> BytesPerRow;
+
+ w += sourcex;
+
+ do
+ {
+ for(i = sourcex, j = x ; i < w ; i++, j++)
+ {
+ if(base[i >> 3] & shift[i & 7])
+ line[j >> 3] |= shift[j & 7];
+ else
+ line[j >> 3] &= masks[j & 7];
+ }
+
+ base += raster;
+
+ line += modulo;
+ }
+ while(--h);
+ }
+
+ return(0);
+ }
+ }
+
+ /* amiga_fill_rectangle_raw():
+ *
+ * Fill a rectangular area in a bitmap.
+ */
+
+ int
+ amiga_fill_rectangle_raw(gx_device *dev,int x,int y,int w,int h,gx_color_index color)
+ {
+ if(x < 0 || x > xdev -> width - w || y < 0 || y > xdev -> height - h)
+ return(-1);
+ else
+ {
+ if(w > 0 && h > 0 && color != gx_no_color_index)
+ {
+ UBYTE *line,startmask,endmask;
+ LONG right,mid,modulo = xdev -> rport -> BitMap -> BytesPerRow;
+
+ right = x + w;
+ mid = (right >> 3) - (x >> 3);
+ line = xdev -> rport -> BitMap -> Planes[0] + y * xdev -> rport -> BitMap -> BytesPerRow + (x >> 3);
+
+ x &= 7;
+ right &= 7;
+
+ if(color)
+ {
+ startmask = 0xFF >> x;
+ endmask = ~(0xFF >> right);
+
+ if(mid)
+ {
+ UBYTE *ptr;
+ int i;
+
+ do
+ {
+ ptr = line;
+
+ *ptr++ |= startmask;
+
+ i = mid;
+
+ while(--i > 0)
+ *ptr++ = 0xFF;
+
+ *ptr |= endmask;
+
+ line += modulo;
+ }
+ while(--h);
+ }
+ else
+ {
+ startmask &= endmask;
+
+ do
+ {
+ *line |= startmask;
+
+ line += modulo;
+ }
+ while(--h);
+ }
+ }
+ else
+ {
+ startmask = ~(0xFF >> x);
+ endmask = 0xFF >> right;
+
+ if(mid)
+ {
+ UBYTE *ptr;
+ LONG i;
+
+ do
+ {
+ ptr = line;
+
+ *ptr++ &= startmask;
+
+ i = mid;
+
+ while(--i > 0)
+ *ptr++ = 0x00;
+
+ *ptr &= endmask;
+
+ line += modulo;
+ }
+ while(--h);
+ }
+ else
+ {
+ startmask |= endmask;
+
+ do
+ {
+ *line &= startmask;
+
+ line += modulo;
+ }
+ while(--h);
+ }
+ }
+ }
+
+ return(0);
+ }
+ }
+
+ /* amiga_draw_line_raw():
+ *
+ * Draw a hair line, your basic DDA algorithm;
+ * keep your fingers crossed.
+ */
+
+ int
+ amiga_draw_line_raw(gx_device *dev,int x,int y,int x1,int y1,gx_color_index color)
+ {
+ if(color != gx_no_color_index && (x != x1 || y != y1))
+ {
+ short xstep,ystep,dx,dy,diff,modulo;
+ UBYTE *line,*plane,pen;
+ LONG last;
+
+ modulo = xdev -> rport -> BitMap -> BytesPerRow;
+ plane = xdev -> rport -> BitMap -> Planes[0];
+
+ line = &plane[y1 * modulo];
+ last = y1;
+ pen = line[x1 >> 3] & (x1 & 7);
+
+ dx = x1 - x;
+ dy = y1 - y;
+
+ if(dx < 0)
+ {
+ dx = -dx;
+ dy = -dy;
+
+ x = x1;
+ y = y1;
+ }
+
+ if(y != last)
+ line = &plane[(last = y) * modulo];
+
+ if(color)
+ {
+ line[x >> 3] |= shift[x & 7];
+
+ xstep = ystep = 0;
+
+ if(dy < 0)
+ {
+ if(dx > -dy)
+ {
+ diff = -dx / 2;
+
+ do
+ {
+ xstep++;
+
+ if(diff > 0)
+ {
+ ystep--;
+
+ diff = diff - dy - dx;
+ }
+ else
+ diff -= dy;
+
+ {
+ LONG x1 = x + xstep,y1 = y + ystep;
+
+ if(y1 != last)
+ line = &plane[(last = y1) * modulo];
+
+ line[x1 >> 3] |= shift[x1 & 7];
+ }
+ }
+ while(xstep < dx);
+ }
+ else
+ {
+ if(dx == -dy)
+ diff = 0;
+ else
+ diff = -dy / 2;
+
+ do
+ {
+ ystep--;
+
+ if(diff > 0)
+ diff -= dx;
+ else
+ {
+ xstep++;
+
+ diff = diff - dy - dx;
+ }
+
+ {
+ LONG x1 = x + xstep,y1 = y + ystep;
+
+ if(y1 != last)
+ line = &plane[(last = y1) * modulo];
+
+ line[x1 >> 3] |= shift[x1 & 7];
+ }
+ }
+ while(ystep > dy);
+ }
+ }
+ else
+ {
+ if(dx > dy)
+ {
+ diff = -dx / 2;
+
+ do
+ {
+ xstep++;
+
+ if(diff > 0)
+ {
+ ystep++;
+
+ diff = diff + dy - dx;
+ }
+ else
+ diff += dy;
+
+ {
+ LONG x1 = x + xstep,y1 = y + ystep;
+
+ if(y1 != last)
+ line = &plane[(last = y1) * modulo];
+
+ line[x1 >> 3] |= shift[x1 & 7];
+ }
+ }
+ while(xstep < dx);
+ }
+ else
+ {
+ if(dx == dy)
+ diff = 0;
+ else
+ diff = dy / 2;
+
+ do
+ {
+ ystep++;
+
+ if(diff > 0)
+ diff -= dx;
+ else
+ {
+ xstep++;
+
+ diff = diff + dy - dx;
+ }
+
+ {
+ LONG x1 = x + xstep,y1 = y + ystep;
+
+ if(y1 != last)
+ line = &plane[(last = y1) * modulo];
+
+ line[x1 >> 3] |= shift[x1 & 7];
+ }
+ }
+ while(ystep < dy);
+ }
+ }
+
+ if(!pen)
+ {
+ if(y1 != last)
+ line = &plane[(last = y1) * modulo];
+
+ line[x1 >> 3] &= masks[x1 & 7];
+ }
+ }
+ else
+ {
+ line[x >> 3] &= masks[x & 7];
+
+ xstep = ystep = 0;
+
+ if(dy < 0)
+ {
+ if(dx > -dy)
+ {
+ diff = -dx / 2;
+
+ do
+ {
+ xstep++;
+
+ if(diff > 0)
+ {
+ ystep--;
+
+ diff = diff - dy - dx;
+ }
+ else
+ diff -= dy;
+
+ {
+ LONG x1 = x + xstep,y1 = y + ystep;
+
+ if(y1 != last)
+ line = &plane[(last = y1) * modulo];
+
+ line[x1 >> 3] &= masks[x1 & 7];
+ }
+ }
+ while(xstep < dx);
+ }
+ else
+ {
+ if(dx == -dy)
+ diff = 0;
+ else
+ diff = -dy / 2;
+
+ do
+ {
+ ystep--;
+
+ if(diff > 0)
+ diff -= dx;
+ else
+ {
+ xstep++;
+
+ diff = diff - dy - dx;
+ }
+
+ {
+ LONG x1 = x + xstep,y1 = y + ystep;
+
+ if(y1 != last)
+ line = &plane[(last = y1) * modulo];
+
+ line[x1 >> 3] &= masks[x1 & 7];
+ }
+ }
+ while(ystep > dy);
+ }
+ }
+ else
+ {
+ if(dx > dy)
+ {
+ diff = -dx / 2;
+
+ do
+ {
+ xstep++;
+
+ if(diff > 0)
+ {
+ ystep++;
+
+ diff = diff + dy - dx;
+ }
+ else
+ diff += dy;
+
+ {
+ LONG x1 = x + xstep,y1 = y + ystep;
+
+ if(y1 != last)
+ line = &plane[(last = y1) * modulo];
+
+ line[x1 >> 3] &= masks[x1 & 7];
+ }
+ }
+ while(xstep < dx);
+ }
+ else
+ {
+ if(dx == dy)
+ diff = 0;
+ else
+ diff = dy / 2;
+
+ do
+ {
+ ystep++;
+
+ if(diff > 0)
+ diff -= dx;
+ else
+ {
+ xstep++;
+
+ diff = diff + dy - dx;
+ }
+
+ {
+ LONG x1 = x + xstep,y1 = y + ystep;
+
+ if(y1 != last)
+ line = &plane[(last = y1) * modulo];
+
+ line[x1 >> 3] &= masks[x1 & 7];
+ }
+ }
+ while(ystep < dy);
+ }
+ }
+
+ if(pen)
+ {
+ if(y1 != last)
+ line = &plane[(last = y1) * modulo];
+
+ line[x1 >> 3] |= pen;
+ }
+ }
+ }
+
+ return(0);
+ }
+
+ /* amiga_open_ilbm(gx_device *dev):
+ *
+ * Open the ilbm device.
+ */
+
+ int
+ amiga_open_ilbm(gx_device *dev)
+ {
+ if(xdev -> width <= 0 || xdev -> height <= 0)
+ {
+ if(xdev -> page_width > 0.0)
+ xdev -> width = (int)(xdev -> x_pixels_per_inch * xdev -> page_width);
+ else
+ xdev -> width = 640;
+
+ if(xdev -> page_height > 0.0)
+ xdev -> height = (int)(xdev -> y_pixels_per_inch * xdev -> page_height);
+ else
+ xdev -> height = 512;
+ }
+
+ if(xdev -> rport = (struct RastPort *)AllocVec(sizeof(struct RastPort),MEMF_ANY))
+ {
+ InitRastPort(xdev -> rport);
+
+ if(xdev -> bitmap = (struct BitMap *)AllocVec(sizeof(struct BitMap),MEMF_ANY))
+ {
+ InitBitMap(xdev -> bitmap,1,xdev -> width,xdev -> height);
+
+ if(xdev -> bitplane = AllocVec(xdev -> bitmap -> Rows * xdev -> bitmap -> BytesPerRow,MEMF_ANY | MEMF_CLEAR))
+ {
+ xdev -> bitmap -> Planes[0] = xdev -> bitplane;
+ xdev -> rport -> BitMap = xdev -> bitmap;
+ xdev -> page_count = 1;
+
+ DarkPen = 0;
+ LightPen = 1;
+
+ return(0);
+ }
+ else
+ {
+ char buffer[256];
+
+ sprintf(buffer,"Ghostscript: failed to allocate raster (wanted %ld, largest %ld)",xdev -> bitmap -> Rows * xdev -> bitmap -> BytesPerRow,AvailMem(MEMF_ANY | MEMF_LARGEST));
+
+ perror(buffer);
+ }
+ }
+ else
+ perror("Ghostscript: failed to allocate bitmap");
+ }
+ else
+ perror("Ghostscript: failed to allocate raster port");
+
+ return(-1);
+ }
+
+ /* amiga_output_page_ilbm(gx_device *dev,int,int):
+ *
+ * Send a bitmap to an IFF-ILBM file.
+ */
+
+ int
+ amiga_output_page_ilbm(gx_device *dev,int num_copies,int flush)
+ {
+ const sigset_t trapped = sigmask(SIGINT);
+ char buffer[270];
+ LONG result = -1;
+
+ sprintf(buffer,"%s_%04d.ilbm",xdev -> file_name,xdev -> page_count);
+
+ fprintf(stdout,"\n\033[ASaving page Nº%d to \"%s\"...\033[K",xdev -> page_count,buffer);
+ fflush(stdout);
+
+ sigprocmask(SIG_BLOCK,&trapped,NULL);
+
+ if(SaveBitMap(buffer,xdev -> bitmap,xdev -> width,xdev -> height,(UWORD)xdev -> x_pixels_per_inch,xdev -> y_pixels_per_inch))
+ {
+ fprintf(stdout,"\n\033[APage saved to file \"%s\".\033[K\n",buffer);
+
+ result = 0;
+
+ xdev -> page_count;
+ }
+ else
+ perror("\n\033[AGhostscript: error saving page\033[K");
+
+ sigprocmask(SIG_UNBLOCK,&trapped,NULL);
+
+ return(result);
+ }
+
+ /* amiga_close_ilbm(gx_device *dev):
+ *
+ * Close the ilbm driver.
+ */
+
+ int
+ amiga_close_ilbm(gx_device *dev)
+ {
+ if(xdev -> bitplane)
+ {
+ FreeVec(xdev -> bitplane);
+
+ xdev -> bitplane = NULL;
+ }
+
+ if(xdev -> bitmap)
+ {
+ FreeVec(xdev -> bitmap);
+
+ xdev -> bitmap = NULL;
+ }
+
+ if(xdev -> rport)
+ {
+ FreeVec(xdev -> rport);
+
+ xdev -> rport = NULL;
+ }
+
+ xdev -> width = xdev -> height = 0;
+ /* xdev -> x_pixels_per_inch = x_pixels_per_inch = 72.72;*/
+
+ return(0);
+ }
+
+ private const gs_prop_item props_amiga[] =
+ {
+ prop_def("PageWidth", prt_string),
+ prop_def("PageHeight", prt_string),
+ prop_def("OutputFile", prt_string)
+ };
+
+ int
+ amiga_get_props(gx_device *dev,gs_prop_item *plist)
+ {
+ int start = gx_default_get_props(dev,plist);
+
+ if(plist != 0)
+ {
+ gs_prop_item *pi = plist + start;
+
+ memcpy(pi,props_amiga,sizeof(props_amiga));
+
+ pi[0] . value .a.p.s = "";
+ pi[0] . value .a.size = -1;
+
+ pi[1] . value .a.p.s = "";
+ pi[1] . value .a.size = -1;
+
+ pi[2] . value .a.p.s = "";
+ pi[2] . value .a.size = -1;
+ }
+
+ return(start + (sizeof(props_amiga) / sizeof(gs_prop_item)));
+ }
+
+ int
+ amiga_put_props(gx_device *dev,gs_prop_item *plist,int count)
+ {
+ gs_prop_item *known[3];
+ LONG code = 0;
+
+ props_extract(plist,count,props_amiga,3,known,0);
+
+ if((code = gx_default_put_props(dev,plist,count)) < 0)
+ return(code);
+ else
+ {
+ if(known[0] != 0)
+ {
+ gs_prop_item *pn = known[0];
+ LONG size = pn -> value . a . size;
+ char temp[256];
+
+ if(size >= 256)
+ {
+ pn -> status = pv_limitcheck;
+
+ code = gs_error_limitcheck;
+ }
+ else
+ {
+ memcpy(temp,pn -> value . a . p . s,size);
+
+ temp[size] = 0;
+
+ xdev -> page_width = GetInches(temp);
+
+ if(xdev -> page_width <= 0.0)
+ {
+ xdev -> page_width = 0.0;
+
+ pn -> status = pv_limitcheck;
+
+ code = gs_error_limitcheck;
+ }
+ else
+ {
+ if(code == 0)
+ code = 1;
+ }
+ }
+ }
+
+ if(known[1] != 0)
+ {
+ gs_prop_item *pn = known[1];
+ LONG size = pn -> value . a . size;
+ char temp[256];
+
+ if(size >= 256)
+ {
+ pn -> status = pv_limitcheck;
+
+ code = gs_error_limitcheck;
+ }
+ else
+ {
+ memcpy(temp,pn -> value . a . p . s,size);
+
+ temp[size] = 0;
+
+ xdev -> page_height = GetInches(temp);
+
+ if(xdev -> page_height <= 0.0)
+ {
+ xdev -> page_height = 0.0;
+
+ pn -> status = pv_limitcheck;
+
+ code = gs_error_limitcheck;
+ }
+ else
+ {
+ if(code == 0)
+ code = 1;
+ }
+ }
+ }
+
+ if(known[2] != 0)
+ {
+ gs_prop_item *pn = known[2];
+ LONG size = pn -> value . a . size;
+
+ if(size >= 256)
+ {
+ pn -> status = pv_limitcheck;
+
+ code = gs_error_limitcheck;
+ }
+ else
+ {
+ memcpy(xdev -> file_name,pn -> value . a . p . s,size);
+
+ xdev -> file_name[size] = 0;
+ }
+ }
+
+ if(code < 0)
+ return_error(code);
+
+ if(xdev -> is_open && code)
+ {
+ LONG ccode = gs_closedevice(dev);
+
+ if(ccode < 0)
+ return(ccode);
+ }
+
+ return(code);
+ }
+ }
+
+ /* amiga_color_map_rgb_color(gx_device *dev,gx_color_value red,gx_color_value green,gx_color_value blue):
+ *
+ * Turn an RGB colour into a pen index.
+ */
+
+ gx_color_index
+ amiga_color_map_rgb_color(gx_device *dev,gx_color_value red,gx_color_value green,gx_color_value blue)
+ {
+ LONG max = xdev -> cube_size - 1,r,g,b;
+
+ r = (max * red) / gx_max_color_value;
+ g = (max * green) / gx_max_color_value;
+ b = (max * blue) / gx_max_color_value;
+
+ return((r * xdev -> cube_size + g) * xdev -> cube_size + b);
+ }
+
+ /* amiga_color_map_color_rgb(gx_device *dev,gx_color_index color,gx_color_value rgb[3]):
+ *
+ * Turn a pen index into RGB colour values.
+ */
+
+ int
+ amiga_color_map_color_rgb(gx_device *dev,gx_color_index color,gx_color_value rgb[3])
+ {
+ LONG i,value,max = xdev -> cube_size - 1;
+
+ for(i = 2 ; i >= 0 ; i--)
+ {
+ value = color % xdev -> cube_size;
+
+ rgb[i] = (gx_max_color_value * value) / max;
+
+ color /= xdev -> cube_size;
+ }
+
+ return(0);
+ }
+
+ /* amiga_color_map_rgb_color_pen(gx_device *dev,gx_color_value red,gx_color_value green,gx_color_value blue):
+ *
+ * Turn an RGB colour into a pen index; this routine takes remapped
+ * pens into account.
+ */
+
+ gx_color_index
+ amiga_color_map_rgb_color_pen(gx_device *dev,gx_color_value red,gx_color_value green,gx_color_value blue)
+ {
+ LONG max = xdev -> cube_size - 1,r,g,b;
+
+ r = (max * red) / gx_max_color_value;
+ g = (max * green) / gx_max_color_value;
+ b = (max * blue) / gx_max_color_value;
+
+ return(xdev -> pens[(r * xdev -> cube_size + g) * xdev -> cube_size + b]);
+ }
+
+ /* amiga_color_map_color_rgb_pen(gx_device *dev,gx_color_index color,gx_color_value rgb[3]):
+ *
+ * Turn a pen index into RGB colour values; this routine takes remapped
+ * pens into account.
+ */
+
+ int
+ amiga_color_map_color_rgb_pen(gx_device *dev,gx_color_index color,gx_color_value rgb[3])
+ {
+ LONG i,value,max = xdev -> cube_size - 1;
+
+ /* Find the matching pen... */
+
+ for(i = 0 ; i < xdev -> cube_size * xdev -> cube_size * xdev -> cube_size ; i++)
+ {
+ if(xdev -> pens[i] == color)
+ {
+ color = i;
+
+ break;
+ }
+ }
+
+ for(i = 2 ; i >= 0 ; i--)
+ {
+ value = color % xdev -> cube_size;
+
+ rgb[i] = (gx_max_color_value * value) / max;
+
+ color /= xdev -> cube_size;
+ }
+
+ return(0);
+ }
+
+ /* amiga_copy_color8():
+ *
+ * Copy a color image, the source is guaranteed to consist of
+ * one byte per colour.
+ */
+
+ int
+ amiga_copy_color8(gx_device *dev,const UBYTE *base,int sourcex,int raster,gx_bitmap_id id,int x,int y,int w,int h)
+ {
+ if(y < 0 || x < 0 || w < 0 || h < 0)
+ return(-1);
+ else
+ {
+ if(w > 0 && h > 0)
+ {
+ base += sourcex;
+
+ if(w > xdev -> width)
+ w = xdev -> width;
+
+ do
+ {
+
+ CopyMem((UBYTE *)base,xdev -> temp_array,w);
+
+ WritePixelLine8(xdev -> rport,x,y++,w,xdev -> temp_array,xdev -> temp_rport);
+
+ base += raster;
+ }
+ while(--h);
+ }
+
+ return(0);
+ }
+ }
+
+ /* amiga_copy_mono_raw_color():
+ *
+ * Copy a monochrome image to a bitmap.
+ */
+
+ int
+ amiga_copy_mono_raw_color(gx_device *dev,const UBYTE *base,int sourcex,int raster,gx_bitmap_id id,int x,int y,int w,int h,gx_color_index zero,gx_color_index one)
+ {
+ if(y < 0 || x < 0 || w < 0 || h < 0)
+ return(-1);
+ else
+ {
+ if(w > 0 && h > 0 && zero != gx_no_color_index && one != gx_no_color_index)
+ {
+ PLANEPTR line[12];
+ LONG i,j,k,modulo = xdev -> rport -> BitMap -> BytesPerRow,depth = xdev -> rport -> BitMap -> Depth;
+
+ for(i = 0 ; i < depth ; i++)
+ line[i] = xdev -> rport -> BitMap -> Planes[i] + y * modulo;
+
+ w += sourcex;
+
+ if(zero == gx_no_color_index)
+ {
+ do
+ {
+ for(i = sourcex, j = x ; i < w ; i++, j++)
+ {
+ if(base[i >> 3] & shift[i & 7])
+ {
+ for(k = 0 ; k < depth ; k++)
+ {
+ if(one & (1 << k))
+ line[k][j >> 3] |= shift[j & 7];
+ else
+ line[k][j >> 3] &= masks[j & 7];
+ }
+ }
+ }
+
+ base += raster;
+
+ for(k = 0 ; k < depth ; k++)
+ line[k] += modulo;
+ }
+ while(--h);
+ }
+ else
+ {
+ if(one == gx_no_color_index)
+ {
+ do
+ {
+ for(i = sourcex, j = x ; i < w ; i++, j++)
+ {
+ if(base[i >> 3] & shift[i & 7])
+ {
+ for(k = 0 ; k < depth ; k++)
+ {
+ if(zero & (1 << k))
+ line[k][j >> 3] |= shift[j & 7];
+ else
+ line[k][j >> 3] &= masks[j & 7];
+ }
+ }
+ }
+
+ base += raster;
+
+ for(k = 0 ; k < depth ; k++)
+ line[k] += modulo;
+ }
+ while(--h);
+ }
+ else
+ {
+ do
+ {
+ for(i = sourcex, j = x ; i < w ; i++, j++)
+ {
+ if(base[i >> 3] & shift[i & 7])
+ {
+ for(k = 0 ; k < depth ; k++)
+ {
+ if(one & (1 << k))
+ line[k][j >> 3] |= shift[j & 7];
+ else
+ line[k][j >> 3] &= masks[j & 7];
+ }
+ }
+ else
+ {
+ for(k = 0 ; k < depth ; k++)
+ {
+ if(zero & (1 << k))
+ line[k][j >> 3] |= shift[j & 7];
+ else
+ line[k][j >> 3] &= masks[j & 7];
+ }
+ }
+ }
+
+ base += raster;
+
+ for(k = 0 ; k < depth ; k++)
+ line[k] += modulo;
+ }
+ while(--h);
+ }
+ }
+ }
+
+ return(0);
+ }
+ }
+
+ /* amiga_copy_color_raw_color16():
+ *
+ * Copy a color image, the source data is guaranteed to consist
+ * of one word per colour.
+ */
+
+ int
+ amiga_copy_color_raw_color16(gx_device *dev,const UBYTE *data,int sourcex,int raster,gx_bitmap_id id,int x,int y,int w,int h)
+ {
+ if(y < 0 || x < 0 || w < 0 || h < 0)
+ return(-1);
+ else
+ {
+ if(w > 0 && h > 0)
+ {
+ PLANEPTR line[12];
+ LONG i,j,k,modulo = xdev -> rport -> BitMap -> BytesPerRow,depth = xdev -> rport -> BitMap -> Depth;
+ UWORD *base = (UWORD *)data;
+
+ for(i = 0 ; i < depth ; i++)
+ line[i] = xdev -> rport -> BitMap -> Planes[i] + y * modulo;
+
+ w += sourcex;
+
+ raster /= 2;
+
+ do
+ {
+ for(i = sourcex, j = x ; i < w ; i++, j++)
+ {
+ for(k = 0 ; k < depth ; k++)
+ {
+ if(base[i] & (1 << k))
+ line[k][j >> 3] |= shift[j & 7];
+ else
+ line[k][j >> 3] &= masks[j & 7];
+ }
+ }
+
+ base += raster;
+
+ for(k = 0 ; k < depth ; k++)
+ line[k] += modulo;
+ }
+ while(--h);
+ }
+
+ return(0);
+ }
+ }
+
+ /* amiga_fill_rectangle_raw_color():
+ *
+ * Fill a rectangular area in a bitmap.
+ */
+
+ int
+ amiga_fill_rectangle_raw_color(gx_device *dev,int x,int y,int w,int h,gx_color_index color)
+ {
+ if(x < 0 || x > xdev -> width - w || y < 0 || y > xdev -> height - h)
+ return(-1);
+ else
+ {
+ if(w > 0 && h > 0 && color != gx_no_color_index)
+ {
+ PLANEPTR line[12];
+ LONG i,j,right,mid,modulo = xdev -> rport -> BitMap -> BytesPerRow,depth = xdev -> rport -> BitMap -> Depth;
+
+ for(i = 0 ; i < depth ; i++)
+ line[i] = xdev -> rport -> BitMap -> Planes[i] + y * modulo + (x >> 3);
+
+ right = x + w;
+ mid = (right >> 3) - (x >> 3);
+
+ x &= 7;
+ right &= 7;
+
+ if(mid)
+ {
+ UBYTE *ptr;
+
+ do
+ {
+ for(j = 0 ; j < depth ; j++)
+ {
+ ptr = line[j];
+
+ i = mid;
+
+ if(color & (1 << j))
+ {
+ *ptr++ |= 0xFF >> x;
+
+ while(--i > 0)
+ *ptr++ = 0xFF;
+
+ *ptr |= ~(0xFF >> right);
+ }
+ else
+ {
+ *ptr++ &= ~(0xFF >> x);
+
+ while(--i > 0)
+ *ptr++ = 0x00;
+
+ *ptr &= 0xFF >> right;
+ }
+
+ line[j] += modulo;
+ }
+ }
+ while(--h);
+ }
+ else
+ {
+ UBYTE one_mask = (0xFF >> x) & ~(0xFF >> right),
+ zero_mask = ~(0xFF >> x) | (0xFF >> right);
+ do
+ {
+ for(j = 0 ; j < depth ; j++)
+ {
+ if(color & (1 << j))
+ *line[j] |= one_mask;
+ else
+ *line[j] &= zero_mask;
+
+ line[j] += modulo;
+ }
+ }
+ while(--h);
+ }
+ }
+
+ return(0);
+ }
+ }
+
+ /* amiga_draw_line_raw_color():
+ *
+ * Draw a hair line, your basic DDA algorithm;
+ * keep your fingers crossed.
+ */
+
+ int
+ amiga_draw_line_raw_color(gx_device *dev,int x,int y,int x1,int y1,gx_color_index color)
+ {
+ if(color != gx_no_color_index && (x != x1 || y != y1))
+ {
+ LONG xstep,ystep,dx,dy,diff,modulo;
+ UBYTE *line,*plane,pen;
+ LONG last,i,orig_x = x,orig_y = y;
+
+ modulo = xdev -> rport -> BitMap -> BytesPerRow;
+
+ for(i = 0 ; i < xdev -> rport -> BitMap -> Depth ; i++)
+ {
+ plane = xdev -> rport -> BitMap -> Planes[i];
+ line = &plane[y1 * modulo];
+ last = y1;
+ pen = line[x1 >> 3] & (x1 & 7);
+ x = orig_x;
+ y = orig_y;
+
+ dx = x1 - x;
+ dy = y1 - y;
+
+ if(dx < 0)
+ {
+ dx = -dx;
+ dy = -dy;
+
+ x = x1;
+ y = y1;
+ }
+
+ if(y != last)
+ line = &plane[(last = y) * modulo];
+
+ if(color & (1 << i))
+ {
+ line[x >> 3] |= shift[x & 7];
+
+ xstep = ystep = 0;
+
+ if(dy < 0)
+ {
+ if(dx > -dy)
+ {
+ diff = -dx / 2;
+
+ do
+ {
+ xstep++;
+
+ if(diff > 0)
+ {
+ ystep--;
+
+ diff = diff - dy - dx;
+ }
+ else
+ diff -= dy;
+
+ {
+ LONG x1 = x + xstep,y1 = y + ystep;
+
+ if(y1 != last)
+ line = &plane[(last = y1) * modulo];
+
+ line[x1 >> 3] |= shift[x1 & 7];
+ }
+ }
+ while(xstep < dx);
+ }
+ else
+ {
+ if(dx == -dy)
+ diff = 0;
+ else
+ diff = -dy / 2;
+
+ do
+ {
+ ystep--;
+
+ if(diff > 0)
+ diff -= dx;
+ else
+ {
+ xstep++;
+
+ diff = diff - dy - dx;
+ }
+
+ {
+ LONG x1 = x + xstep,y1 = y + ystep;
+
+ if(y1 != last)
+ line = &plane[(last = y1) * modulo];
+
+ line[x1 >> 3] |= shift[x1 & 7];
+ }
+ }
+ while(ystep > dy);
+ }
+ }
+ else
+ {
+ if(dx > dy)
+ {
+ diff = -dx / 2;
+
+ do
+ {
+ xstep++;
+
+ if(diff > 0)
+ {
+ ystep++;
+
+ diff = diff + dy - dx;
+ }
+ else
+ diff += dy;
+
+ {
+ LONG x1 = x + xstep,y1 = y + ystep;
+
+ if(y1 != last)
+ line = &plane[(last = y1) * modulo];
+
+ line[x1 >> 3] |= shift[x1 & 7];
+ }
+ }
+ while(xstep < dx);
+ }
+ else
+ {
+ if(dx == dy)
+ diff = 0;
+ else
+ diff = dy / 2;
+
+ do
+ {
+ ystep++;
+
+ if(diff > 0)
+ diff -= dx;
+ else
+ {
+ xstep++;
+
+ diff = diff + dy - dx;
+ }
+
+ {
+ LONG x1 = x + xstep,y1 = y + ystep;
+
+ if(y1 != last)
+ line = &plane[(last = y1) * modulo];
+
+ line[x1 >> 3] |= shift[x1 & 7];
+ }
+ }
+ while(ystep < dy);
+ }
+ }
+
+ if(!pen)
+ {
+ if(y1 != last)
+ line = &plane[(last = y1) * modulo];
+
+ line[x1 >> 3] &= masks[x1 & 7];
+ }
+ }
+ else
+ {
+ line[x >> 3] &= masks[x & 7];
+
+ xstep = ystep = 0;
+
+ if(dy < 0)
+ {
+ if(dx > -dy)
+ {
+ diff = -dx / 2;
+
+ do
+ {
+ xstep++;
+
+ if(diff > 0)
+ {
+ ystep--;
+
+ diff = diff - dy - dx;
+ }
+ else
+ diff -= dy;
+
+ {
+ LONG x1 = x + xstep,y1 = y + ystep;
+
+ if(y1 != last)
+ line = &plane[(last = y1) * modulo];
+
+ line[x1 >> 3] &= masks[x1 & 7];
+ }
+ }
+ while(xstep < dx);
+ }
+ else
+ {
+ if(dx == -dy)
+ diff = 0;
+ else
+ diff = -dy / 2;
+
+ do
+ {
+ ystep--;
+
+ if(diff > 0)
+ diff -= dx;
+ else
+ {
+ xstep++;
+
+ diff = diff - dy - dx;
+ }
+
+ {
+ LONG x1 = x + xstep,y1 = y + ystep;
+
+ if(y1 != last)
+ line = &plane[(last = y1) * modulo];
+
+ line[x1 >> 3] &= masks[x1 & 7];
+ }
+ }
+ while(ystep > dy);
+ }
+ }
+ else
+ {
+ if(dx > dy)
+ {
+ diff = -dx / 2;
+
+ do
+ {
+ xstep++;
+
+ if(diff > 0)
+ {
+ ystep++;
+
+ diff = diff + dy - dx;
+ }
+ else
+ diff += dy;
+
+ {
+ LONG x1 = x + xstep,y1 = y + ystep;
+
+ if(y1 != last)
+ line = &plane[(last = y1) * modulo];
+
+ line[x1 >> 3] &= masks[x1 & 7];
+ }
+ }
+ while(xstep < dx);
+ }
+ else
+ {
+ if(dx == dy)
+ diff = 0;
+ else
+ diff = dy / 2;
+
+ do
+ {
+ ystep++;
+
+ if(diff > 0)
+ diff -= dx;
+ else
+ {
+ xstep++;
+
+ diff = diff + dy - dx;
+ }
+
+ {
+ LONG x1 = x + xstep,y1 = y + ystep;
+
+ if(y1 != last)
+ line = &plane[(last = y1) * modulo];
+
+ line[x1 >> 3] &= masks[x1 & 7];
+ }
+ }
+ while(ystep < dy);
+ }
+ }
+
+ if(pen)
+ {
+ if(y1 != last)
+ line = &plane[(last = y1) * modulo];
+
+ line[x1 >> 3] |= pen;
+ }
+ }
+ }
+ }
+
+ return(0);
+ }
diff -rc --new-file ghostscript-2.6.1-fsf/gp_amiga.c ghostscript-2.6.1-amiga/gp_amiga.c
*** ghostscript-2.6.1-fsf/gp_amiga.c Thu Jan 1 00:00:00 1970
--- ghostscript-2.6.1-amiga/gp_amiga.c Sat Jan 29 15:11:38 1994
***************
*** 0 ****
--- 1,346 ----
+ /* Copyright (C) 1989, 1990, 1991 Aladdin Enterprises. All rights reserved.
+ Distributed by Free Software Foundation, Inc.
+
+ 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. */
+
+ /* gp_amiga.c */
+ /* Amiga specific routines for Ghostscript */
+
+ #define timeval foo1
+ #define ushort foo2
+
+ #include <intuition/intuitionbase.h>
+ #include <graphics/gfxbase.h>
+ #include <dos/dosextens.h>
+
+ #include <clib/exec_protos.h>
+ #include <clib/dos_protos.h>
+
+ /*
+ #include <inline/exec.h>
+ #include <inline/dos.h>
+ */
+
+ #include <signal.h>
+
+ #undef ushort
+ #undef timeval
+
+ /* gp_amiga.c */
+ /* Amiga-specific routines for Ghostscript */
+
+
+ #include "memory_.h"
+ #include "string_.h"
+ #include "gx.h"
+ #include "gp.h"
+ #include "stat_.h"
+ #include "time_.h"
+
+ struct IntuitionBase *IntuitionBase;
+ struct GfxBase *GfxBase;
+ struct Library *LayersBase,
+ *IFFParseBase,
+ *AslBase,
+ *UtilityBase;
+
+ /* Nothing happens here */
+ void
+ gs_amiga_init()
+ {
+ }
+
+ void
+ gp_exit(int exit_status, int code)
+ {
+ }
+
+ /* Cleanup routine, as called by atexit() trap */
+ void
+ cleanup()
+ {
+ extern void devcleanup();
+
+ devcleanup();
+
+ if(IFFParseBase)
+ {
+ CloseLibrary(IFFParseBase);
+
+ IFFParseBase = NULL;
+ }
+
+ if(AslBase)
+ {
+ CloseLibrary(AslBase);
+
+ AslBase = NULL;
+ }
+
+ if(UtilityBase)
+ {
+ CloseLibrary(UtilityBase);
+
+ UtilityBase = NULL;
+ }
+
+ if(LayersBase)
+ {
+ CloseLibrary(LayersBase);
+
+ LayersBase = NULL;
+ }
+
+ if(GfxBase)
+ {
+ CloseLibrary((struct Library *)GfxBase);
+
+ GfxBase = NULL;
+ }
+
+ if(IntuitionBase)
+ {
+ CloseLibrary((struct Library *)IntuitionBase);
+
+ IntuitionBase = NULL;
+ }
+ }
+
+ void
+ signal_handler(int signal)
+ {
+ fprintf(stderr,"*** BREAK: Ghostscript\a\n");
+
+ exit(1);
+ }
+
+ /* Do platform-dependent initialization */
+ void
+ gp_init()
+ {
+ atexit(cleanup);
+
+ signal(SIGINT,signal_handler);
+
+ if(!(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",37)))
+ {
+ perror("Ghostscript: cannot open intuition.library v37");
+
+ exit(20);
+ }
+
+ if(!(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",37)))
+ {
+ perror("Ghostscript: cannot open graphics.library v37");
+
+ exit(20);
+ }
+
+ if(!(LayersBase = OpenLibrary("layers.library",37)))
+ {
+ perror("Ghostscript: cannot open layers.library v37");
+
+ exit(20);
+ }
+
+ if(!(UtilityBase = OpenLibrary("utility.library",37)))
+ {
+ perror("Ghostscript: cannot open utility.library v37");
+
+ exit(20);
+ }
+
+ if(!(IFFParseBase = OpenLibrary("iffparse.library",37)))
+ {
+ perror("Ghostscript: cannot open iffparse.library v37");
+
+ exit(20);
+ }
+
+ AslBase = OpenLibrary("asl.library",38);
+ }
+
+ /* Read the current date (in days since Jan. 1, 1980) */
+ /* and time (in milliseconds since midnight). */
+ void
+ gp_get_clock(long *pdt)
+ {
+ struct DateStamp Date;
+
+ DateStamp(&Date);
+
+ pdt[0] = Date . ds_Days + 2 * 365;
+ pdt[1] = (Date . ds_Minute * 60 + Date . ds_Tick / TICKS_PER_SECOND) * 1000;
+ }
+
+ /* ------ Printer accessing ------ */
+
+ /* Open a connection to a printer. A null file name means use the */
+ /* standard printer connected to the machine, if any. */
+ /* "|command" opens an output pipe. */
+ /* Return NULL if the connection could not be opened. */
+ FILE *
+ gp_open_printer(char *fname, int binary_mode)
+ { return
+ (strlen(fname) == 0 ?
+ gp_open_scratch_file(gp_scratch_file_name_prefix, fname, "w") :
+ fname[0] == '|' ?
+ popen(fname + 1, "w") :
+ fopen(fname, "w"));
+ }
+
+ /* Close the connection to the printer. */
+ void
+ gp_close_printer(FILE *pfile, const char *fname)
+ { if ( fname[0] == '|' )
+ pclose(pfile);
+ else
+ fclose(pfile);
+ }
+
+ /* ------ File name syntax ------ */
+
+ /* Define the character used for separating file names in a list. */
+ const char gp_file_name_list_separator = ',';
+
+ /* Define the default scratch file name template. */
+ const char gp_scratch_file_name_prefix[] = "T:gs_";
+
+ /* Define the string to be concatenated with the file mode */
+ /* for opening files without end-of-line conversion. */
+ const char gp_fmode_binary_suffix[] = "b";
+ /* Define the file modes for binary reading or writing. */
+ const char gp_fmode_rb[] = "r";
+ const char gp_fmode_wb[] = "w";
+
+ /* Create and open a scratch file with a given name prefix. */
+ /* Write the actual file name at fname. */
+ FILE *
+ gp_open_scratch_file(const char *prefix, char *fname, const char *mode)
+ {
+ strcpy(fname,prefix);
+ /* Prevent trailing X's in path from being converted by mktemp. */
+ if ( *fname != 0 && fname[strlen(fname) - 1] == 'X' )
+ strcat(fname, "-");
+ strcat(fname, "XXXXXX");
+ mktemp(fname);
+ return fopen(fname, mode);
+ }
+
+ /* Answer whether a file name contains a directory/device specification, */
+ /* i.e. is absolute (not directory- or device-relative). */
+ int
+ gp_file_name_is_absolute(const char *fname, uint len)
+ {
+ int i;
+
+ for(i = 0 ; i < len ; i++)
+ {
+ if(fname[i] == ':')
+ return(1);
+ }
+
+ return(0);
+ }
+
+ /* Answer the string to be used for combining a directory/device prefix */
+ /* with a base file name. The file name is known to not be absolute. */
+ const char *
+ gp_file_name_concat_string(const char *prefix, uint plen, const char *fname, uint len)
+ {
+ if(plen > 0 && (prefix[plen - 1] == '/' || prefix[plen - 1] == ':'))
+ return("");
+ else
+ return("/");
+ }
+
+ /* ------ File operations ------ */
+
+ /* If the file given by fname exists, fill in its status and return 1; */
+ /* otherwise return 0. */
+ int
+ gp_file_status(const char *fname, file_status *pstatus)
+ { struct stat sbuf;
+ /* The RS/6000 prototype for stat doesn't include const, */
+ /* so we have to explicitly remove the const modifier. */
+ if ( stat((char *)fname, &sbuf) < 0 ) return 0;
+ pstatus->size_pages = stat_blocks(&sbuf); /* st_blocks is */
+ /* missing on some systems, */
+ /* see stat_.h */
+ pstatus->size_bytes = sbuf.st_size;
+ pstatus->time_referenced = sbuf.st_mtime;
+ pstatus->time_created = sbuf.st_ctime;
+ return 1;
+ }
+
+
+ /* ------ File enumeration ------ */
+
+ /****** THIS IS NOT SUPPORTED ON UNIX SYSTEMS. ******/
+ /* Amazingly enough, there is no standard Unix library routine */
+ /* for enumerating the files matching a pattern, */
+ /* or even for enumerating (conveniently) the files in a directory. */
+
+ struct file_enum_s {
+ char *pattern;
+ int first_time;
+ const gs_memory_procs *mprocs;
+ };
+
+ /* Initialize an enumeration. NEEDS WORK ON HANDLING * ? \. */
+ file_enum *
+ gp_enumerate_files_init(const char *pat, uint patlen,
+ const gs_memory_procs *mprocs)
+ { file_enum *pfen = (file_enum *)(*mprocs->alloc)(1, sizeof(file_enum), "gp_enumerate_files");
+ char *pattern;
+ if ( pfen == 0 ) return 0;
+ pattern = (*mprocs->alloc)(patlen + 1, 1,
+ "gp_enumerate_files(pattern)");
+ if ( pattern == 0 ) return 0;
+ memcpy(pattern, pat, patlen);
+ pattern[patlen] = 0;
+ pfen->pattern = pattern;
+ pfen->mprocs = mprocs;
+ pfen->first_time = 1;
+ return pfen;
+ }
+
+ /* Enumerate the next file. */
+ /* PUNT: JUST RETURN THE PATTERN. */
+ uint
+ gp_enumerate_files_next(file_enum *pfen, char *ptr, uint maxlen)
+ { if ( pfen->first_time )
+ { char *pattern = pfen->pattern;
+ uint len = strlen(pattern);
+ pfen->first_time = 0;
+ if ( len > maxlen )
+ return maxlen + 1;
+ strcpy(ptr, pattern);
+ return len;
+ }
+ return -1;
+ }
+
+ /* Clean up the file enumeration. */
+ void
+ gp_enumerate_files_close(file_enum *pfen)
+ { const gs_memory_procs *mprocs = pfen->mprocs;
+ (*mprocs->free)(pfen->pattern, strlen(pfen->pattern) + 1, 1,
+ "gp_enumerate_files_close(pattern)");
+ (*mprocs->free)((char *)pfen, 1, sizeof(file_enum),
+ "gp_enumerate_files_close");
+ }
diff -rc --new-file ghostscript-2.6.1-fsf/gs.1 ghostscript-2.6.1-amiga/gs.1
*** ghostscript-2.6.1-fsf/gs.1 Wed May 19 10:41:20 1993
--- ghostscript-2.6.1-amiga/gs.1 Tue Feb 22 13:49:34 1994
***************
*** 154,160 ****
3.
The directory/ies specified by the GS_LIB_DEFAULT macro in the
Ghostscript makefile (which has been set to
! "/usr/local/lib/ghostscript:/usr/local/lib/ghostscript/fonts").
.PP
Each of these (GS_LIB_DEFAULT, GS_LIB, and \-I parameter) may be either
a single directory, or a list of directories separated by a `:'.
--- 154,160 ----
3.
The directory/ies specified by the GS_LIB_DEFAULT macro in the
Ghostscript makefile (which has been set to
! "/gnu/lib/ghostscript:/gnu/lib/ghostscript/fonts").
.PP
Each of these (GS_LIB_DEFAULT, GS_LIB, and \-I parameter) may be either
a single directory, or a list of directories separated by a `:'.
***************
*** 320,335 ****
device, as described above.
.SH FILES
.TP
! .B /usr/local/lib/ghostscript/*
Startup-files, utilities, and basic font definitions.
.TP
! .B /usr/local/lib/ghostscript/fonts/*
Additional font definitions.
.TP
! .B /usr/local/lib/ghostscript/examples/*
Demo Ghostscript files.
.TP
! .B /usr/local/lib/doc/ghostscript/doc/*
Assorted document files.
.SH "SEE ALSO"
The various Ghostscript document files (above).
--- 320,335 ----
device, as described above.
.SH FILES
.TP
! .B /gnu/lib/ghostscript/*
Startup-files, utilities, and basic font definitions.
.TP
! .B /gnu/lib/ghostscript/fonts/*
Additional font definitions.
.TP
! .B /gnu/lib/ghostscript/examples/*
Demo Ghostscript files.
.TP
! .B /gnu/lib/doc/ghostscript/doc/*
Assorted document files.
.SH "SEE ALSO"
The various Ghostscript document files (above).
diff -rc --new-file ghostscript-2.6.1-fsf/gsaddmod ghostscript-2.6.1-amiga/gsaddmod
*** ghostscript-2.6.1-fsf/gsaddmod Sun May 16 06:55:00 1993
--- ghostscript-2.6.1-amiga/gsaddmod Sun Jan 30 12:28:23 1994
***************
*** 1,3 ****
export m; m=$1
shift
! echo $* >>${m}.dev
--- 1,4 ----
export m; m=$1
shift
! # The builtin echo in pdksh is not up to this task.
! /bin/echo $* >>${m}.dev
diff -rc --new-file ghostscript-2.6.1-fsf/gsnd ghostscript-2.6.1-amiga/gsnd
*** ghostscript-2.6.1-fsf/gsnd Mon Feb 8 09:50:18 1993
--- ghostscript-2.6.1-amiga/gsnd Thu Jan 27 21:39:59 1994
***************
*** 1 ****
! gs -DNODISPLAY $*
--- 1,4 ----
! .key ARGS/F
! .bra {
! .ket }
! gs -DNODISPLAY {ARGS}
diff -rc --new-file ghostscript-2.6.1-fsf/gssetdev ghostscript-2.6.1-amiga/gssetdev
*** ghostscript-2.6.1-fsf/gssetdev Sun May 16 06:56:28 1993
--- ghostscript-2.6.1-amiga/gssetdev Sun Jan 30 12:28:27 1994
***************
*** 1,3 ****
export m; m=$1
shift
! echo -dev ${m} -obj $* >${m}.dev
--- 1,4 ----
export m; m=$1
shift
! # The builtin echo in pdksh is not up to this task.
! /bin/echo -dev ${m} -obj $* >${m}.dev
diff -rc --new-file ghostscript-2.6.1-fsf/gssetmod ghostscript-2.6.1-amiga/gssetmod
*** ghostscript-2.6.1-fsf/gssetmod Sun May 16 06:56:14 1993
--- ghostscript-2.6.1-amiga/gssetmod Sun Jan 30 12:28:32 1994
***************
*** 1,3 ****
export m; m=$1
shift
! echo -obj $* >${m}.dev
--- 1,4 ----
export m; m=$1
shift
! # The builtin echo in pdksh is not up to this task.
! /bin/echo -obj $* >${m}.dev
diff -rc --new-file ghostscript-2.6.1-fsf/make.doc ghostscript-2.6.1-amiga/make.doc
*** ghostscript-2.6.1-fsf/make.doc Fri May 28 22:57:00 1993
--- ghostscript-2.6.1-amiga/make.doc Tue Feb 22 13:50:59 1994
***************
*** 82,88 ****
follows:
- GS_LIB_DEFAULT: on Unix systems, /usr/local/lib/ghostscript
! and /usr/local/lib/ghostscript/fonts; on MS-DOS systems, C:\GS.
- TDEBUG: no debugging code included in the build.
--- 82,89 ----
follows:
- GS_LIB_DEFAULT: on Unix systems, /usr/local/lib/ghostscript
! and /usr/local/lib/ghostscript/fonts; on MS-DOS systems, C:\GS; on AmigaDOS
! systems, /gnu (aka gnu:)
- TDEBUG: no debugging code included in the build.
diff -rc --new-file ghostscript-2.6.1-fsf/ps2ascii ghostscript-2.6.1-amiga/ps2ascii
*** ghostscript-2.6.1-fsf/ps2ascii Thu Jan 27 21:23:52 1994
--- ghostscript-2.6.1-amiga/ps2ascii Thu Jan 27 21:41:23 1994
***************
*** 1,13 ****
! #!/bin/sh -f
! # Extract ASCII text from a PostScript file. Usage:
! # ps2ascii [infile.ps [outfile.txt]]
! # If outfile is omitted, output goes to stdout.
! # If both infile and outfile are omitted, ps2ascii acts as a filter,
! # reading from stdin and writing on stdout.
! if ( test $# -eq 0 ) then
! gs -q -dNODISPLAY -dNOBIND -dWRITESYSTEMDICT -dSIMPLE ps2ascii.ps - quit.ps
! elif ( test $# -eq 1 ) then
! gs -q -dNODISPLAY -dNOBIND -dWRITESYSTEMDICT -dSIMPLE ps2ascii.ps $1 quit.ps
! else
! gs -q -dNODISPLAY -dNOBIND -dWRITESYSTEMDICT -dSIMPLE ps2ascii.ps $1 quit.ps >$2
! fi
--- 1,4 ----
! .key IN/A,OUT/A
! .bra {
! .ket }
! gs -q -dNODISPLAY -dNOBIND -dWRITESYSTEMDICT -dSIMPLE gs_2asc.ps {IN} quit.ps >{OUT}
diff -rc --new-file ghostscript-2.6.1-fsf/ps2epsi ghostscript-2.6.1-amiga/ps2epsi
*** ghostscript-2.6.1-fsf/ps2epsi Fri May 7 18:39:56 1993
--- ghostscript-2.6.1-amiga/ps2epsi Thu Jan 27 21:41:46 1994
***************
*** 1,52 ****
! #!/bin/sh
! LOCALPATH=/usr/local/bin
! PATH=/bin:/usr/bin:/usr/ucb\:$LOCALPATH\
! export PATH outfile
! if [ $# -lt 1 -o $# -gt 2 ]; then
! echo "Usage: pstoepsi file.ps [file.epsi]" 1>&2
! exit 1
! fi
! infile=$1
!
! if [ $# -eq 1 ]
! then
! case "${infile}" in
! *.ps) base=`basename ${infile} .ps` ;;
! *.cps) base=`basename ${infile} .cps` ;;
! *.eps) base=`basename ${infile} .eps` ;;
! *.epsf) base=`basename ${infile} .epsf` ;;
! *) base=`basename ${infile}` ;;
! esac
! outfile=${base}.epsi
! else
! outfile=$2
! fi
!
! gs -q -dNOPAUSE -dNODISPLAY ps2epsi.ps < ${infile} 1>&2
!
! (
! cat << BEGINEPS
! /InitDictCount countdictstack def
! gsave
! save
! mark
! newpath
! /showpage {} def
! BEGINEPS
!
! cat ${infile}
!
! cat << ENDEPS
! countdictstack InitDictCount sub { end } repeat
! cleartomark
! restore
! grestore
! ENDEPS
!
! ) >> ${outfile}
!
! exit 0
--- 1,12 ----
! .key IN/A,OUT/A
! .bra [
! .ket ]
! gs -q -dNOPAUSE -dNODISPLAY ps2epsi.ps < [IN]
! Echo "/InitDictCount countdictstack def gsave save mark newpath" >> [OUT]
! type [OUT] >> [IN]
! Echo "countdictstack InitDictCount sub { end } repeat" >> [OUT]
! Echo "cleartomark restore grestore" >> [OUT]
diff -rc --new-file ghostscript-2.6.1-fsf/use.doc ghostscript-2.6.1-amiga/use.doc
*** ghostscript-2.6.1-fsf/use.doc Thu Jan 27 21:27:38 1994
--- ghostscript-2.6.1-amiga/use.doc Tue Feb 22 13:51:42 1994
***************
*** 106,114 ****
Installing Ghostscript on a Unix system requires compiling it first.
The name of the executable is gs. The makefile installs all the
! files, except the fonts, in /usr/local or various subdirectories
thereof. The fonts should be installed in
! /usr/local/lib/ghostscript/fonts. Consult the makefile for more
details.
********
--- 106,114 ----
Installing Ghostscript on a Unix system requires compiling it first.
The name of the executable is gs. The makefile installs all the
! files, except the fonts, in /gnu or various subdirectories
thereof. The fonts should be installed in
! /gnu/lib/ghostscript/fonts. Consult the makefile for more
details.
********