summaryrefslogtreecommitdiff
path: root/support/pstools/cep
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/pstools/cep
Initial commit
Diffstat (limited to 'support/pstools/cep')
-rw-r--r--support/pstools/cep/0cep_lic.eng48
-rw-r--r--support/pstools/cep/0cep_lic.pol50
-rw-r--r--support/pstools/cep/cep.awk205
-rw-r--r--support/pstools/cep/cep.bat48
-rw-r--r--support/pstools/cep/cepcop_e.inf371
-rw-r--r--support/pstools/cep/cepcop_p.inf478
-rw-r--r--support/pstools/cep/cop.awk143
-rw-r--r--support/pstools/cep/cop.bat49
-rw-r--r--support/pstools/cep/uncep.awk140
-rw-r--r--support/pstools/cep/uncep.bat31
-rw-r--r--support/pstools/cep/uncop.awk103
-rw-r--r--support/pstools/cep/uncop.bat31
12 files changed, 1697 insertions, 0 deletions
diff --git a/support/pstools/cep/0cep_lic.eng b/support/pstools/cep/0cep_lic.eng
new file mode 100644
index 0000000000..87dba7dcce
--- /dev/null
+++ b/support/pstools/cep/0cep_lic.eng
@@ -0,0 +1,48 @@
+ This file belongs to the CEP package | Ten plik nale/zy do pakietu CEP
+ This package is public domain | Pakiet stanowi dobro powszechne
+========================================================================
+
+CEP package consists of:
+ Info files:
+ 0CEP_LIC.ENG -- English license (This file)
+ 0CEP_LIC.POL -- Polish license
+ CEPCOP_E.INF -- English documentation
+ CEPCOP_P.INF -- Polish documentation
+ CEP subpackage:
+ CEP.AWK -- CEP compression program
+ CEP.BAT -- MSDOS system script for CEP.AWK
+ UNCEP.AWK -- CEP uncompression program
+ UNCEP.BAT -- MSDOS system script for UNCEP.AWK
+ COP subpackage:
+ COP.AWK -- COP compression program
+ COP.BAT -- MSDOS system script for COP.AWK
+ UNCOP.AWK -- COP uncompression program
+ UNCOP.BAT -- MSDOS system script for UNCOP.AWK
+
+=======================================================================
+
+AUTHORS: Bogu\l{}aw Jackowski, Piotr Pianowski, Piotr Strzelczyk
+Mail: BOP s.c., ul. Piastowska 70, 80-363 Gda\'nsk, Poland
+Email: B.Jackowski@GUST.org.pl
+
+=======================================================================
+
+All copyrights, copylefts, copyups, copydowns, or whatever you wish to call
+them, concerning all the files in the CEP package are essentially of the
+public domain character.
+
+This package is distributed in the hope that it will be useful, but without
+any warranty. Although the authors have attempted to find and correct any bugs
+in the package, they are not responsible for any damage or losses of any kind
+caused by the use or misuse of the package. The authors are under no
+obligation to provide service, corrections, or upgrades to this package.
+
+If you alter a file or if you distrubute incomplete package,
+please remove the lines containing the comment:
+
+ `This file belongs to the CEP package | Ten plik nale/zy do pakietu CEP'
+
+in order to avoid mess.
+
+=======================================================================
+END OF `0CEP_LIC.ENG'
diff --git a/support/pstools/cep/0cep_lic.pol b/support/pstools/cep/0cep_lic.pol
new file mode 100644
index 0000000000..46359e284d
--- /dev/null
+++ b/support/pstools/cep/0cep_lic.pol
@@ -0,0 +1,50 @@
+ This file belongs to the CEP package | Ten plik nale/zy do pakietu CEP
+ This package is public domain | Pakiet stanowi dobro powszechne
+========================================================================
+
+Pakiet CEP sk/lada si/e z:
+ Plik/ow informacyjnych:
+ 0CEP_LIC.ENG -- Licencja w j/ezyku angielskim
+ 0CEP_LIC.POL -- Licencja w j/ezyku polskim (niniejszy plik)
+ CEPCOP_E.INF -- Angielska dokumentacja
+ CEPCOP_P.INF -- Polska dokumentacja
+ Podpakietu CEP:
+ CEP.AWK -- program kompresuj/acy CEP
+ CEP.BAT -- skrypt wsadowy uruchamiaj/acy CEP.AWK
+ UNCEP.AWK -- program dekompresuj/acy pliki CEP-a
+ UNCEP.BAT -- skrypt wsadowy uruchamiaj/acy UNCEP.AWK
+ Podpakietu COP:
+ COP.AWK -- program kompresuj/acy COP
+ COP.BAT -- skrypt wsadowy uruchamiaj/acy COP.AWK
+ UNCOP.AWK -- program dekompresuj/acy pliki COP-a
+ UNCOP.BAT -- skrypt wsadowy uruchamiaj/acy UNCOP.AWK
+
+=======================================================================
+
+AUTORZY: Bogus/law Jackowski, Piotr Pianowski, Piotr Strzelczyk
+Adres: BOP s.c., ul. Piastowska 70, 80-363 Gda/nsk, Poland
+Email: B.Jackowski@GUST.org.pl
+
+=======================================================================
+
+Wszystkie prawa, lewa, g/ory, do/ly autorskie, czy jak tam to zwa/c,
+dotycz/ace wszystkich plik/ow wchodz/acych w sk/lad pakietu CEP,
+maj/a charakter dobra publicznego.
+
+Rozpowszechniaj/ac ten pakiet mamy nadziej/e, /ze oka/ze si/e on przydatny,
+nie dajemy jednak na niego /zadnej gwarancji. Starali/smy si/e znale/x/c
+i usun/a/c z pakietu wszystkie b/l/edy, ale nie ponosimy /zadnej
+odpowiedzialno/sci za uszkodzenia b/ad/x straty wywo/lane jego w/la/sciwym
+lub niew/la/sciwym u/zyciem. Jednocze/snie zaznaczamy, /ze o ile b/edziemy
+starali si/e piel/egnowa/c pakiet, o tyle nie nie podejmujemy /zadnych
+zobowi/aza/n w tej mierze.
+
+Je/zeli plik zosta/l zmodyfikowany lub rozpowszechniana jest tylko cz/e/s/c
+pakietu, prosimy o usuni/ecie linii zawieraj/acych komentarz:
+
+ ,,This file belongs to the CEP package | Ten plik nale/zy do pakietu CEP''
+
+w celu unikni/ecia ba/laganu.
+
+=======================================================================
+KONIEC ,,0CEP_LIC.POL''
diff --git a/support/pstools/cep/cep.awk b/support/pstools/cep/cep.awk
new file mode 100644
index 0000000000..7360796e4b
--- /dev/null
+++ b/support/pstools/cep/cep.awk
@@ -0,0 +1,205 @@
+# This file belongs to the CEP package | Ten plik nale/zy do pakietu CEP
+# This package is public domain | Pakiet stanowi dobro powszechne
+# For more info see `0CEP_LIC.ENG' | Wi/ecej informacji w ,,0CEP_LIC.POL''
+# ===========================================================================
+# E: "Hex bitmap EPS" --> "filtered EPS" converter
+# input - input file name
+# OUTF - output file name
+# CVM - conversion method
+# TMPSX - temporary PostScript file name
+#
+# P: Konwerter "Hex bitmap EPS" --> "filtered EPS"
+# wej/scie - nazwa pliku konwertowanego
+# OUTF - nazwa pliku wyj/sciowego
+# CVM - metoda konwersji EPS-a
+# TMPSX - nazwa tymczasowego pliku PostScriptowego
+
+BEGIN {
+ ver_no=1.03
+ gs_abort="2 2 .quit"
+ RS="\015|\012|\015\012"
+ # preparing temporary files | przygotowywanie plik/ow tymczasowych
+ if (TMPSX=="") TMPSX="tmp.psx"
+ if (CVM!~/[LlRrFfNn]/) CVM=CVM "R" # Default coding and compression method
+ if (CVM!~/[Hh8]/) CVM=CVM "8" # Domy/slna metoda kodowania i kompresji
+ printf "CEP ver. " ver_no ", Coding:"
+ if (is_A85()) printf " A85"
+ if (is_HEX()) printf " Hex"
+ if (is_LZW()) printf ", LZW"
+ if (is_RLE()) printf ", RLE"
+ if (is_ZIP()) printf ", Flate (non-standard in PostScript Level 2!)"
+ print ""
+ flag="pre"
+}
+
+ # searching for ``strange lines'' is due to the following problem:
+ # a single hex char in line or Postscript command "def" and "add" in prolog
+ # may be misunderstood for a HEX bitmap (see also ``heuristic trick'')
+ # poszukiwanie ,,dziwnych wierszy'' wi/a/ze si/e z nast/epuj/acym problemem:
+ # pojedynczy znak w wierszu oraz instrukcje Postscriptu "def" i "add"
+ # stanowi/ace cz/e/s/c prologu mog/a zosta/c b/l/ednie uznane za
+ # fragment szesnastkowej mapy bitowej (patrz ,,heurystyczny fortel'')
+
+{is_hex_line=/^[0-9A-Fa-f]*$/
+ if (flag=="hex") {
+ if (is_hex_line) {hex_dig_num+=length($0)} else {flag="post"; pos_lines++}
+ } else {is_odd_line=/^(def|add|[0-9A-Fa-f]|)$/
+ if (flag=="pre") {
+ if (is_hex_line && !is_odd_line) {flag="hex"; hex_dig_num+=length($0)}
+ else {prolog=prolog $0 "\n"; pre_lines++}
+ } else {
+ if (is_hex_line && !is_odd_line) {flag="xhex"; exit} else {pos_lines++}
+ }
+ }
+}
+
+END {
+ if (flag=="pre") errmessage("HEX bitmap not found.", 1)
+ if (flag=="xhex") errmessage("more than one HEX bitmap's found.", 2)
+
+ # fix (somehow) length of bitmap bufor
+ # ustalanie d/lugo/sci bufora b/ed/acej dzielnikiem d/lugo/sci mapy bitowej
+ if ((hex_dig_num%2)!=0)
+ errmessage("Odd number of HEX digits in the bitmap.", 3)
+ hex_dig_num=hex_dig_num/2
+ buff_len=8192
+ while (hex_dig_num%buff_len!=0) buff_len--
+ buff_num=hex_dig_num/buff_len
+
+ # modification of the preamble of compressed EPS file
+ # dostosowanie preambu/ly pliku EPS do czytania kompresowanych danych
+ if (match(prolog,/\n%%BoundingBox:[^\n]*\n/))
+ prolog = substr(prolog,1,RSTART+RLENGTH-1) banner() "\n" uncep_comment() "\n" substr(prolog,RSTART+RLENGTH)
+ else
+ errmessage("\"%%BoundingBox:\" not found.", 4)
+ if (gsub(/currentfile/,"_fltrd_file",prolog)==0)
+ errmessage("illegible EPS preamble.", 5)
+ if (gsub(/readhexstring/,"_read_string",prolog)==0)
+ errmessage("illegible EPS preamble.", 6)
+ if (match(prolog, /\n[^%\n]/))
+ prolog = substr(prolog,1,RSTART-1) "\n" source() substr(prolog,RSTART)
+ else
+ errmessage("illegible EPS preamble.", 7)
+ # heuristic trick: | heurystyczny fortel:
+ # odd lines at the end of prolog are to be considered as a bitmap beginning
+ # dziwne linie na ko/ncu prologu nale/zy uzna/c za pocz/atek mapy bitowej
+ if (match(prolog,/\n((def|add|[0-9A-Fa-f])\n)+$/)) {
+ prolog = substr(prolog,1,RSTART);
+ print "CEP warning: peculiar bitmap beginning."
+ }
+ gsub(/%/,"%%",prolog) # neutralizing printf | podmiana dla printf
+
+ # WRITE PostScript ENCODING PROGRAM | TWORZENIE PROGRAMU Postscript-owego
+ out_ps_errorhandler()
+ #
+ out_ps("(" ps_fname(OUTF) ") (w) file /w_file exch def")
+ out_ps("(" ps_fname(FILENAME) ") (r) file /r_file exch def")
+ out_ps("/l_string 255 string def")
+ out_ps("/p_string 4096 string def")
+ out_ps("/b_string " buff_len " string def")
+ out_ps("/flushclose {dup flushfile closefile} def")
+ # copy preamble | przepisywanie preambu/ly
+ out_ps(pre_lines " {r_file l_string readline pop pop} repeat")
+ out_ps(pre_lines+3 " {currentfile l_string readline pop")
+ out_ps("w_file exch writestring w_file (\\n) writestring} repeat")
+ out_ps_block(prolog)
+ out_ps("%--- PROLOG END | KONIEC PROLOGU")
+ # special treatment of the ASCII85 encoded lines looking like DSC comments
+ # dodatkowa obr/obka wierszy (zakodowanych jako ASCII85) zaczynaj/acych
+ # si/e tak jak komentarze DSC
+ if (is_A85()) {
+ out_ps("{pop (%) anchorsearch {pop w_file (%\\n ) writestring} if")
+ out_ps(" {(\\n%) search not {exit} if")
+ out_ps(" w_file exch writestring pop w_file (\\n%\\n ) writestring} loop")
+ out_ps(" w_file exch writestring p_string}")
+ out_ps("/NullEncode filter dup")
+ } else out_ps("w_file")
+ # prepare encoding filters | przygotowywanie filtr/ow koduj/acych
+ if (is_A85()) out_ps("/ASCII85Encode filter")
+ if (is_HEX()) out_ps("/ASCIIHexEncode filter")
+ if (is_LZW()) out_ps("dup /LZWEncode filter")
+ if (is_RLE()) out_ps("dup 0 /RunLengthEncode filter")
+ if (is_ZIP()) out_ps("dup /FlateEncode filter")
+ # loop encoding bitmap | p/etla koduj/aca map/e bitow/a
+ out_ps(buff_num " {r_file b_string readhexstring pop")
+ out_ps("1 index exch writestring} repeat")
+ if (is_A85()) out_ps("flushclose flushclose")
+ if (is_HEX()) out_ps("flushclose")
+ if (is_LZW()) out_ps("flushclose")
+ if (is_RLE()) out_ps("flushclose")
+ if (is_ZIP()) out_ps("flushclose")
+ # copy postamble | przepisanie postambu/ly
+ out_ps(pos_lines+1 " {r_file l_string readline pop")
+ out_ps("w_file exch writestring w_file (\\n) writestring} repeat")
+ out_ps("w_file flushclose r_file closefile quit")
+ printf "."
+}
+
+function banner() {return "%%Creator: CEP ver. " ver_no " by BOP s.c."}
+
+function ps_fname(s) {gsub(/\\/,"/",s); return(s)}
+
+function out_ps(s) {print s > TMPSX}
+function out_ps_block(block) {printf block > TMPSX}
+
+function out_ps_errorhandler() {
+ out_ps("/errq {" gs_abort "} def")
+ out_ps("errordict begin ")
+ out_ps("/typecheck {255 string cvs (filter) search")
+ out_ps(" {(\\010!Filter failed) print")
+ out_ps(" ( (ASCII85Encode used with GS version<3.0?)\\n\\007) print}")
+ out_ps(" {(\\010!Something went wrong\\n Error: typecheck\\n\\007) print}")
+ out_ps(" ifelse errq} def")
+ out_ps("/ioerror {(\\010!Input/Output error occurred. (Disk full?)\\n\\007)")
+ out_ps(" print errq} def")
+ out_ps("/handleerror {$error begin (Something went wrong) print")
+ out_ps(" (\\n Error: ) print errorname 255 string cvs print")
+ out_ps(" (\\n\\007) print end errq} def")
+ out_ps("end")
+ #
+ out_ps("systemdict /resourcestatus known not")
+ out_ps("{(\\010!This version of Ghostscript doesn't support required Level 2 features\\n\\007)")
+ out_ps(" print quit} if")
+ if (is_A85()) {
+ check_filter("ASCII85Encode", "ASCII85Encode filter")
+ check_filter("NullEncode", "required Level 2 filters")
+ }
+ if (is_HEX()) check_filter("ASCIIHexEncode", "ASCIIHexEncode filter")
+ if (is_LZW()) check_filter("LZWEncode", "LZWEncode filter")
+ if (is_RLE()) check_filter("RunLengthEncode", "RunLengthEncode filter")
+ if (is_ZIP()) check_filter("FlateEncode", "FlateEncode filter")
+}
+ function check_filter(name, expl) {
+ out_ps("/" name " /Filter resourcestatus {pop pop}")
+ out_ps("{(\\010!This version of Ghostscript doesn't support " expl "\\n\\007)")
+ out_ps(" print errq} ifelse")
+ }
+
+function errmessage(errname, errnum) {
+ print "CEP ERROR:", errname "\007"; exit(errnum)
+}
+
+ # searching for the most recent, i.e., active, options
+ # poszukiwanie ostatniej (obowi/azuj/acej) opcji
+function is_A85() {return (CVM~/8[^Hh]*$/) }
+function is_HEX() {return (CVM~/[Hh][^8]*$/) }
+function is_LZW() {return (CVM~/[Ll][^NnRrFf]*$/) }
+function is_RLE() {return (CVM~/[Rr][^NnLlFf]*$/) }
+function is_ZIP() {return (CVM~/[Ff][^NnLlRr]*$/) }
+
+function uncep_comment() {
+ s="%UNCEPInfo: " pre_lines+3 " " buff_num " " buff_len " " pos_lines+1
+ return s
+}
+
+function source() {
+ s="/_fltrd_file currentfile"
+ if (is_A85()) s=s " /ASCII85Decode filter"
+ if (is_HEX()) s=s " /ASCIIHexDecode filter"
+ if (is_LZW()) s=s " /LZWDecode filter"
+ if (is_RLE()) s=s " /RunLengthDecode filter"
+ if (is_ZIP()) s=s " /FlateDecode filter"
+ s=s " def /_read_string /readstring load def"
+ return s
+}
+
diff --git a/support/pstools/cep/cep.bat b/support/pstools/cep/cep.bat
new file mode 100644
index 0000000000..00b55cea08
--- /dev/null
+++ b/support/pstools/cep/cep.bat
@@ -0,0 +1,48 @@
+:: This file belongs to the CEP package | Ten plik nale/zy do pakietu CEP
+:: This package is public domain | Pakiet stanowi dobro powszechne
+:: For more info see `0CEP_LIC.ENG' | Wi/ecej informacji w ,,0CEP_LIC.POL''
+:: ===========================================================================
+:: E: Bitmap EPS file compression program
+:: This program compresses and codes, using standard methods of
+:: Postscript Level 2, bitmap EPS files (hexadecimal, not compressed).
+::
+:: P: Program do kompresji EPS-/ow bitmapowych.
+:: S/lu/zy on do pakowania oraz kodowania bitmapowych, kodowanych
+:: szesnastkowo, niekompresowanych plik/ow EPS za pomoc/a
+:: standardowych algorytm/ow Postscriptu Level 2.
+::
+@echo off
+if "%2"=="" goto USAGE
+if "%1"=="%2" goto USAGE
+if not exist %1 goto USAGE
+gawk32 -fcep.awk -vTMPSX=tmp.psx -vOUTF=%2 -vCVM=%3%4 %1
+if errorlevel==1 goto DONE
+SET DOS4G=quiet
+if exist tmp.psx call gs386.exe -q -dNODISPLAY tmp.psx
+if exist tmp.psx del tmp.psx
+echo .
+goto DONE
+::
+:USAGE
+echo E: USAGE:
+echo cep input_file output_file [options]
+echo the program recognizes the following options:
+echo 8 -- use ASCII85 coding (default)
+echo h or H -- use HEX (hexadecimal) coding
+echo r or R -- use RLE (RunLength) compression (default)
+echo l or L -- use LZW compression
+echo f or F -- use Flate compression (non-standard!)
+echo n or N -- don't compress
+echo (names of input_file and output_file must differ)
+echo.
+echo P: WYWO/LANIE:
+echo cep plik_wej/sciowy plik_wyj/sciowy [opcje]
+echo program rozpoznaje nast/epuj/ace opcje:
+echo 8 -- kodowanie ASCII85 (domy/slnie)
+echo h lub H -- kodowanie HEX -- szesnastkowe
+echo r lub R -- kompresja RLE -- RunLength (domy/slnie)
+echo l lub L -- kompresja LZW
+echo f lub F -- kompresja Flate (niestandardowa!)
+echo n lub N -- bez kompresji
+echo (nazwa pliku wyj/sciowego musi by/c r/o/zna od nazwy pliku wej/sciowego)
+:DONE
diff --git a/support/pstools/cep/cepcop_e.inf b/support/pstools/cep/cepcop_e.inf
new file mode 100644
index 0000000000..9bcb88db56
--- /dev/null
+++ b/support/pstools/cep/cepcop_e.inf
@@ -0,0 +1,371 @@
+This file belongs to the CEP package | Ten plik nale/zy do pakietu CEP
+This package is public domain | Pakiet stanowi dobro powszechne
+For more info see `0CEP_LIC.ENG' | Wi/ecej informacji w ,,0CEP_LIC.POL''
+===========================================================================
+`CEPCOP_E.INF' -- ENGLISH DOCUMENTATION
+
+The amount of disk space occupied by bitmap graphics is a well-recognized
+problem. For example, 300dpi picture A4 contains ca 8 700 000 pixels;
+assuming that each CMYK pixel occupies four bytes, one obtains ca 35MB
+of disk space needed to store the picture.
+
+Now, imagine a poor TeX-er, who is not allowed to use binary graphic data
+(because of the otherwise magnificent DVIPS), thus the poor TeX-er usually
+converts the binary data to hexadecimal EPSes, thus doubling the required
+space, and next, after compiling a document with TeX+DVIPS, the whole graphic
+data is put into the resulting PS file, so the required space is doubled
+again -- altogether 140MB per one A4 page. Night-mare begins...
+
+This problem is not a new one, it was was recognised by Adobe relatively long
+time ago. In the Level 2 specification they included objects called filters
+which enable data compression. In particular, instead of hexadecimal data one
+can use ASCII85 encoding (alike unix utility uuencode-uudecode), run length
+compression, LZW compression, DCT (used in JPEG compressed files), and many
+others. Why not to make use of these tools? The question is not as silly as
+it may look at the first glance, as there exist relatively few applications
+generating well-compressed PostScript graphics.
+
+We decided to patch somehow this gap. We developed a little package enabling
+the compression of ``normal'' (non-compressed) graphic data. The nature of
+the problem is more complex, however, than one might expect. In particular,
+a universal, always efficient compression technique does not exist. Hence the
+package has several ``buttons'' which enable controlling various aspects of
+compression.
+ * * *
+
+Our package consists of four AWK programs, CEP.AWK-UNCEP.AWK and
+COP.AWK-UNCOP.AWK. CEP.AWK and COP.AWK generate (on-the-fly) PostScript
+programs which, processed by Ghostscript, yield the appropriate data
+compression. UNCEP and UNCOP accomplish (using a similar technique) the
+reverse process, i.e., uncompression.
+
+CEP is devised for the compression of usual bitmap EPS files, containing
+a single, hexadecimally coded image; COP can be used to compress any
+PostScript data.
+
+The question arises: why to use two packing techniques? The answer is
+simple: the efficiency of compression is higher if a compressing program
+knows in advance which kind of data are to be expected. In general, bitmaps
+are more regular (redundant) than arbitrary PostScript data, hence even
+simple algorithms turn out to be more efficient.
+
+Tests show that in the best case (screen dumps) squeezing up to 10% of the
+original size is nothing unusual. Sometimes, however, no compression method
+gives a satisfactory result. In such a case, one can always use encoding data
+using ASCII85 filter, obtaining a reduction of a hexadecimal bitmap size by
+approximately 35%.
+
+Below we give a brief description of CEP and COP. So far, only the MS DOS
+version of the PS-compressors is available. In this version the GAWK-EMX.EXE
+implementation of AWK and GS386.EXE Ghostscript interpreter are used.
+
+We tested the package using several Ghostscript and GAWK implementations,
+now we use Ghostscript 5.10 and GAWK 3.0.3.
+
+==========================================================================
+ C E P AND U N C E P
+==========================================================================
+
+The CEP subpackage consist of the MS DOS batch files CEP.BAT and UNCEP.BAT
+and the AWK programs CEP.AWK and UNCEP.AWK. First, AWK inspects the source
+EPS file doing its best to recognize a position of a hexadecimal bitmap, next
+it creates an appropriate PostScript program, and then the control is passed
+on to Ghostscript which just performs the submitted program: encodes the
+bitmap and copies verbatim the remaining lines. The original preamble is
+slightly modified; nevertheless, all DSC comments are left intact.
+
+If the bitmap cannot be found or the AWK suspects that troubles may arise,
+the CEP engine gives up.
+
+The resulting file should be verified prior to removing the original one,
+as the CEP heuristic tricks may fail to fix the bitmap properly; moreover,
+due to GS bugs, premature removing of source may also be painful.
+
+CEP never generates binary output -- only hexadecimal or ASCII85 encoding
+are supported. This is due to the fact that CEP-compressed EPS files are
+primarily meant to be used in the contexts of TeX+DVIPS. Nevertheless,
+the resulting files can be used in other typesetting systems as so-called
+placeable EPSes. The applicability to non-TeX application, however,
+is somewhat limited, as binary TIFF previews may be misinterpreted by (G)AWK.
+
+UNCEP requires that a CEP-compressed file was not changed. In particular,
+it relies on the information in a quasi-DSC comment `%UNCEPInfo:'. This
+information can be destroyed by a seemingly innocent modification (e.g., by
+adding or removing a comment line). Note that the technique employed by CEP
+destroys, by its nature, the information about the line-breaking structure
+of the hexadecimal bitmap. Therefore, UNCEP cannot retrieve the original file.
+Line-breaking structure does not make any problem for a PostScript
+interpreter. There exist programs, however, reading their own bitmap EPS
+files, which for unknown reasons make use of such (sub)lexical information;
+Aldus PhotoStyler is a notable example.
+
+CEP USAGE: cep.bat input_file output_file [options]
+ the program recognizes the following options:
+ 8 -- use ASCII85 coding (default)
+ h or H -- use HEX (hexadecimal) coding
+ r or R -- use RLE (RunLength) compression (default)
+ l or L -- use LZW compression
+ f or F -- use Flate compression (non-standard!)
+ n or N -- don't compress
+NOTE: names of input_file and output_file must differ.
+
+UNCEP USAGE: uncep.bat input_file output_file
+NOTE: names of input_file and output_file must differ;
+ decompression and decoding method is taken from input file.
+
+==========================================================================
+ C O P AND U N C O P
+==========================================================================
+
+The subpackage consist of the MS DOS batch files COP.BAT and UNCOP.BAT, and
+the AWK programs COP.AWK and UNCOP.AWK. COP reads and encodes appropriately the
+supplied data. No analysis of the PostScript data is performed, as the entire
+file is encoded without changing even a bit. The only aspect that is taken
+into account is the DSC comment `%%BoundingBox:'; if it is found, COP inserts
+this comments in the preamble, otherwise the resulting file does not contain
+the bounding box information.
+
+COP-generated files are readable to any PostScript Level 2 interpreter.
+
+UNCOP scans the header and deduces from it the method of decompression, hence
+no options are needed. UNCOP, unlike UNCEP, retrieves precisely the original
+file. It is still recommended, however, that a user verifies whether the
+resulting file is properly interpreted by GS. Due to GS bugs, premature
+removing of the source file after compression or decompression may turn out
+to be painful.
+
+Since COP can be used to compress any data for arbitrary applications, also
+binary encoding is allowed. The resulting files can be used typesetting
+systems that accept so-called placeable EPSes. Unfortunately, binary TIFF
+previews makes files after compression illegible for PostScript.
+
+COP USAGE: cop.bat input_file output_file [options]
+ the program recognizes the following options:
+ 8 -- use ASCII85 coding (default)
+ b or B -- use binary coding
+ h or H -- use HEX (hexadecimal) coding
+ r or R -- use RLE (RunLength) compression (default)
+ l or L -- use LZW compression
+ f or F -- use Flate compression (non-standard!)
+ n or N -- don't compress
+NOTE: names of input_file and output_file must differ;
+ observe that binary encoding is, in fact, no encoding at all.
+
+UNCOP USAGE: uncop.bat input_file output_file
+NOTE: names of input_file and output_file must differ;
+ decompression and decoding method is taken from input file.
+
+=============================================================================
+ A HEAP OF REMARKS CONCERNING C E P AND C O P
+=============================================================================
+
+The applied solution addresses several problems:
+
+ * It is not at all obvious how to determine syntactically
+ where a hexadecimal bitmap begins in an EPS file; semantic analysis
+ (by redefining PostScript primitives image, imagemask and colorimage)
+ is possible, but it has also its limitations; anyway, we decided
+ to recognize a bitmap syntactically, which implied a problem of
+ recognizing such artefacts as `add' or `def' which look like
+ fragments of a bitmap but, in fact, they are not.
+
+ * Also, it is not obvious which compression method should be applied for
+ a given data; usually, ASCII85 encoding is advisable; for pure bitmaps
+ (CEP) RLE compression is satisfactory, although LZW and Flate filters
+ produce usually much better results (the latter seams to be the best);
+ nevertheless, both LZW and Flate encodings have limited usability:
+ (a) LZW encoding is not implemented in GS ver. 4.x due to USA
+ patent law; Aladdin implemented an LZW-compatible filter instead,
+ which produces non-compressed data (in fact, enlarged by some 10%)
+ readable for any LZWDecode filter. You can use old GS version,
+ or compile a GS version containing the real LZW filter on your
+ own risk, but...
+ (b) Flate encoding (the same that is used in GZIP) is not available
+ (yet?) on PostScript phototypesetters -- in the Ghostscript
+ documentation one can find a moderately encouraging passage:
+ ``Ghostscript also supports the as yet undocumented
+ FlateEncode and FlateDecode filters from PDF 1.2
+ and (presumably) PostScript Level 3''
+ As a rule of thumb we would suggest not to use any compression but
+ ASCII85 for detailed colour photo images. It is just weakness of all
+ non-lossy techniques -- algorithms employed by ARJ, ZIP, LHARC,
+ and others would yield also poor results. A reasonable alternative
+ for the data of this kind would be DCT (JPEG) compression.
+
+ * As was mentioned above, ASCII85 encoding can usually be recommended;
+ it added, however, some troubles. First, due to GS bugs, we decided
+ to add the (dummy) NullEncode filter which seems to cure the problem.
+ But there is one more problem: ASCII85 encoded bitmaps may contain
+ lines looking like DSC comments, i.e, they may begin with double percent
+ sign, %%, or with a pair percent-exclamation sign, %! -- why Adobe
+ didn't exclude a percent from ASCII85?. Some programs may try to
+ interprete maybe-DSC lines. For example, DVIPS just removes
+ such lines, unless option -K0 is not used; on the other hand,
+ leaving DSC comments intact may stupefy document managers.
+
+ * It would be convenient to have some more filters implemented, in
+ particular DCT and CCITTFax; both of them, however, make use of some
+ additional input data which makes using them more complex; moreover,
+ it is not clear whether one can find the optimal compression parameters
+ for DCT without a WYSIWYG program; we consider a possibility of
+ one-to-one conversion between JPEG files and EPS files making use of
+ DCT filters; also, a similar conversion between GIF files and EPS files
+ making use of LZW filters can perhaps be implemented.
+
+ * The package takes care of the working disk space -- no large temporary
+ files are created; roughly, the needed disk space is equal to the size
+ of the source + the size of the target.
+
+ * In order to check whether a given phototypesetter is a genuine
+ PostScript Level 2 interpreter, a trial-and-error method is necessary,
+ since many commercial PostScript devices only claim to be Level 2
+ compatible. The following file may be helpful for verifying
+ the claims of the producer of a PostScript device:
+
+ %!PS-Adobe-2.0 EPSF-1.2
+ %%Pages: 1
+ %%BoundingBox: 0 0 540 150
+ %%EndComments
+ /Helvetica 8 selectfont
+ 90 rotate
+ 1 2 moveto
+ (*)
+ {0 -10 rmoveto gsave show grestore}
+ 255 string
+ /Filter
+ resourceforall
+ showpage
+ %%EOF
+
+ Running this program yields the list of filters for a given device.
+ The error reported during the processing of this file proves that
+ the device is not Level 2 compatible. In such a case, using the
+ CEP package should be abandoned.
+
+ * bugs and traps:
+
+ (a) Apparently prepending `flushfile' to `closefile' neutralizes an
+ error in GS 3.x (tail of output swallowed).
+
+ (b) Adding (a dummy) NullEncode filter neutralizes (probably) another
+ GS bug: ASCII85Encode filter with target procedure may produce
+ superfluous EOD marks, i.e., ~> (if things go really bad you can
+ obtain thousands of them). Using the target procedure instead of
+ a file object excludes GS ver. < 3.x, because early Ghostscripts
+ didn't support all features of PostScript Level 2. Nevertheless,
+ GS ver. >= 2.6 can be used for compression with hexadecimal encoding
+ (it has the ``legal'' LZW compression)
+
+ (c) the target procedure mentioned (b), in turn, is due to special
+ treatment of the ASCII85 encoded lines looking like DSC comments;
+ this special treatment is breaking lines after the first percent
+ character. It is dedicated to the DVIPS driver which has a dangerous
+ option `remove comments' (-K1)
+
+ (d) an artificial form of quitting `{2 2 .quit}' instead of `{2 .quit}'
+ is due to an infinite loop of GS 3.5x caused by the latter form.
+ The GS internal operation `.quit' was chosen to provide error
+ handling at the level of operating system.
+
+ (e) still, there exist bugs in older Ghostscripts that we were not able
+ to neutralize; e.g., some EPS files are properly compressed
+ by GS 2.6, but GS 2.6 breaks while displaying them; GS 3.51
+ behaves similarly with other bitmaps. So far, GS 4.x seems to be
+ the most resistant to the ``filter trial,'' but it also reveals
+ some deficiences.
+
+ (f) summing up, we would strongly recommend using GS 4.x or 5.x
+ (possibly with LZWEncode compiled in) and GAWK 3.x: GS 4.x is
+ nearly complete implementation of the Level 2 PostScript;
+ GAWK 3.x provides regular expressions for record separators,
+ which makes possible to force to handle end-of-lines in exactly
+ the same manner as PostScript does and, moreover, is more reliable
+ than earlier versions.
+
+==========================================================================
+ H I S T O R Y
+==========================================================================
+
+CEP+UNCEP:
+ 0.10 -- 16.03.97 -- first version
+ 0.20 -- 05.04.97 -- some obvious bugs removed
+ 0.30 -- 11.04.97 -- new method of prolog modification (processing complex
+ prologs is enabled), and merging output file in
+ Postscript (faster and less disk space needed)
+
+ 0.35 -- 13.04.97 -- comments added (bilingual version)
+ 0.40 -- 14.04.97 -- significant improvement of performance
+ 0.50 -- 15.04.97 -- strings allocated statically, temporary files not
+ created, (speed improved and demand for disk space
+ slashed)
+ 0.60 -- 19.04.97 -- postScript error handling added, some GS bugs
+ neutralized
+ 0.65 -- 20.04.97 -- exit code added, frame documentation provided
+ 0.70 -- 21.04.97 -- UNCEP added
+ 0.75 -- 24.04.97 -- problems of end-of-data and end-of-lines fixed;
+ documentation collected
+ 1.00 -- 02.05.97 -- public domain release (BachoTeX '97)
+ 1.03 -- 07.01.98 -- documentation touched, package (CEP.AWK) more robust
+
+COP+UNCOP:
+ 0.10 -- 06.04.97 -- first version
+ 0.20 -- 12.04.97 -- program structure unified with CEP, "cvx exec" used
+ in place of "run"
+ 0.25 -- 13.04.97 -- comments added (bilingual version)
+ 0.30 -- 15.04.97 -- strings allocated statically (speed improved)
+ 0.40 -- 19.04.97 -- postScript error handling added, some GS bugs
+ neutralized
+ 0.45 -- 20.04.97 -- exit code added, frame documentation provided
+ 0.50 -- 24.04.97 -- problems of end-of-lines fixed; documentation collected
+ 1.00 -- 02.05.97 -- public domain release (BachoTeX '97)
+ 1.03 -- 07.01.98 -- documentation touched, package (CEP.AWK) more robust
+
+==========================================================================
+ V O C A B U L A R Y
+==========================================================================
+
+Ghostscript, GS -- a magnificent interpreter of PostScript language
+ by Aladdin Enterprise, available as a free public license product;
+ its current version (4.03) turns out to be much more reliable
+ than not a few commercial interpreters.
+AWK -- a utility and a programming language for convenient and efficient
+ batch data-reformatting; written in 1977 by Alfred V. Aho,
+ Peter J. Weinberger, and Brian W. Kernighan.
+GAWK -- Gnu AWK, GNU Free Software Foundation implementation of AWK,
+ written in 1986 by Paul Rubin and Jay Fenlason, with advice
+ from Richard Stallman.
+GNU -- The Free Software Foundation (FSF) is a non-profit organization
+ dedicated to the production and distribution of freely
+ distributable software, founded by Richard M. Stallman.
+TeX -- public domain typesyetting system by Donald E. Knuth of
+ Stanford University
+DVIPS -- TeX-to-PostScript driver by Tomas Rokicki of Stanford University
+DSC -- Document Structuring Convention -- Adobe's standard
+ for structuring PostScript documents.
+ASCII85 -- PostScript algorithm of coding binary data as 7-bit ASCII
+ text consisting of only printable characters; encodes every
+ four bytes as five characters from `%' to `u'; additionaly
+ `z' is used to code four zeros (see PostScript Language
+ Reference Manual, second edition, pp. 128--130)
+RLE -- run length encoding -- a standard method of data compression
+ (see PostScript Language Reference Manual, second edition,
+ pp. 133--134)
+LZW -- an algorithm of data compression by J. Ziv, A. Lempel (1978),
+ improved by T. Welch (1984); Unisys, at the time Welch's employer,
+ was granted an US patent in 1985 on Welch's algorithm; a grandfather
+ clause was established by Unisys to make pre-1995 implementations
+ of LZW code free of royalty requirements, thereby eliminating such
+ claims on UNIX compress (information after Nelson H. F. Beebe,
+ e-mail beebe@math.utah.edu)
+DCT -- discrete cosine transform compression, an elaborated, very
+ efficient but lossy compression scheme
+JPEG -- Joint Photographic Experts Group, an organization responsible
+ for developing an international standard for compression of
+ image data; PostScript (Level 2) DCTEncoding filter conforms
+ to the JPEG-proposed standard.
+GZIP -- compressing tool by GNU Free Software Foundation, based on
+ superior and unpatented compression algorithm, developed in order
+ to get rid of the patented LZW algorithm.
+=======================================================================
+END OF `CEPCOP_E.INF'
+
diff --git a/support/pstools/cep/cepcop_p.inf b/support/pstools/cep/cepcop_p.inf
new file mode 100644
index 0000000000..9e5ab9715a
--- /dev/null
+++ b/support/pstools/cep/cepcop_p.inf
@@ -0,0 +1,478 @@
+This file belongs to the CEP package | Ten plik nale/zy do pakietu CEP
+This package is public domain | Pakiet stanowi dobro powszechne
+For more info see `0CEP_LIC.ENG' | Wi/ecej informacji w ,,0CEP_LIC.POL''
+===========================================================================
+,,CEPCOP_P.INF'' -- DOKUMENTACJA POLSKA
+
+Osoby zajmuj/ace si/e obr/obk/a danych graficznych od zawsze maj/a k/lopoty
+z ogromnymi i wci/a/z rosn/acymi plikami. Na przyk/lad grafika formatu A4
+przeskanowana w rozdzielczo/sci 300 DPI sk/lada si/e z ok. 8 700 000 pikseli.
+Je/sli jest to kolorowa mapa bitowa, w kt/orej ka/zdy piksel opisany jest
+czterema bajtami (CMYK), to zajmuje ona na dysku w przybli/zeniu 35 MB.
+
+Niestety, to dopiero pocz/atek. U/zytkownik TeX-a nie mo/ze u/zywa/c danych
+w postaci binarnej (nie pozwala na to niestety DVIPS). Nasz biedny TeX-nik
+konwertuje wi/ec grafik/e do postaci szesnastkowego EPS, co dwukrotnie
+zwi/eksza zajmowane przez ni/a miejsce. Pami/etajmy r/ownie/z, /ze trzeba
+zarezerwowa/c sobie co najmniej jeszcze raz tyle miejsca na dysku, aby mia/l
+gdzie powsta/c po przetworzeniu dokumentu TeX-em i DVIPS-em wynikowy plik .PS
+zawieraj/acy ca/l/a informacj/e graficzn/a. Okazuje si/e wi/ec, /ze na
+ka/zd/a stron/e A4 potrzebujemy 140 MB na dysku. A dyski niestety
+kosztuj/a...
+
+Problem ten jest znany ju/z od dawna. Firma Adobe, tworz/ac wiele lat temu
+PostScript, najpopularniejszy j/ezyk opisu strony, zawar/la w specyfikacji
+poziomu drugiego (Level 2) obiekty zwane filtrami, umo/zliwiaj/ace kompresj/e
+danych. Mo/zemy wi/ec zamiast kodowania szesnastkowego zastosowa/c kodowanie
+ASCII85 (podobne do tego z UNIX-owego uuencode). Mamy te/z dost/ep do
+kompresji algorytmem ,,run length'', algorytmem LZW, stosowanym w plikach
+JPEG algorytmem DCT, a tak/ze kilku innych. Nasuwa si/e pytanie, dlaczego
+w codziennej praktyce nie stosuje si/e tych metod kompresji? Ot/o/z niewiele
+program/ow -- nie wiedzie/c czemu -- potrafi zapisa/c grafik/e w postaci
+skompresowanych plik/ow EPS, a do tego s/a to programy ma/lo popularne.
+
+Poni/zszy pakiet w pewnym zakresie rozwi/azuje ten problem. Umo/zliwia on
+kompresowanie najcz/e/sciej spotykanych, nieskompresowanych PostScript-owych
+plik/ow graficznych. Niestety, w trakcie pracy nad programem okaza/lo si/e,
+/ze problem jest bardziej skomplikowany, ni/z si/e pocz/atkowo wydawa/lo.
+Na przyk/lad nie da si/e wybra/c jednego, najlepszego algorytmu kompresji
+i zawsze go stosowa/c. Wyb/or ten musi zale/ze/c od rodzaju kompresowanych
+danych, ich postaci, a tak/ze spodziewanego zastosowania. Z tego w/la/snie
+powodu pakiet sk/lada si/e z a/z dw/och zestaw/ow program/ow, z kt/orych
+ka/zdy posiada kilka opcji, umo/zliwiaj/acych pewne sterowanie procesem
+kompresji.
+
+ * * *
+
+Nasz pakiet sk/lada si/e z dw/och par program/ow AWK-owych: CEP.AWK-UNCEP.AWK
+oraz COP.AWK-UNCOP.AWK. CEP.AWK i COP.AWK tworz/a na podstawie analizy danych
+wej/sciowych program PostScript-owy, kt/ory przetwarzany przez Ghostscript-a,
+dokonuje w/la/sciwej kompresji danych i tworzy plik wynikowy. UNCEP.AWK
+i UNCOP.AWK wykonuj/a (u/zywaj/ac zbli/zonej metody) proces odwrotny,
+to znaczy dekompresj/e danych do postaci wej/sciowej.
+
+CEP zosta/l stworzony do kompresji cz/esto spotykanych plik/ow EPS
+zawieraj/acych pojedyncz/a map/e bitow/a zakodowan/a szesnastkowo;
+COP potrafi skompresowa/c dowolne dane PostScript-owe.
+
+Powstaje pytanie, po co u/zywa/c CEP-a, je/zeli COP potrafi skompresowa/c
+dowolny plik PostScript-owy. Odpowied/x jest bardzo prosta -- CEP wie, jakich
+danych si/e spodziewa/c, i w zwi/azku z tym potrafi je spakowa/c du/zo
+efektywniej. Poprawa efektywno/sci wynika z dw/och czynnik/ow. Po pierwsze
+CEP spodziewa si/e danych szesnastkowych, czyli przyjmuje, /ze dwa znaki kodu
+opisuj/a jeden bajt mapy bitowej (co ju/z powoduje zwi/ekszenie upakowania
+informacji). Po drugie mapy bitowe maj/a najcz/e/sciej zdecydowanie bardziej
+regularn/a (redundantn/a) struktur/e ni/z przeci/etny kod PostScript-owy.
+Wynika z tego, /ze w przypadku map bitowych nawet prostsze algorytmy
+kompresji mog/a da/c bardzo dobre rezultaty.
+
+Z naszych eksperyment/ow wynika, /ze przy dobrych danych wej/sciowych (zrzuty
+grafiki z ekranu) /latwo jest osi/agn/a/c nawet dwudziestokrotn/a kompresj/e.
+Niestety, w niekt/orych przypadkach /zadna metoda kompresji nie daje
+efekt/ow. W takiej sytuacji zawsze mo/zemy zastosowa/c filtr ASCII85, kt/ory
+zmniejszy obj/eto/s/c mapy bitowej zakodowanej szesnastkowo o oko/lo 35%.
+
+Poni/zej kr/otko opisujemy dzia/lanie CEP-a i COP-a. Jak na razie, pakiet ten
+dzia/la tylko w systemie MS DOS, cho/c mamy nadziej/e, /ze uda si/e go /latwo
+przenie/s/c na inne platformy, tam gdzie s/a dost/epne GAWK i Ghostscript.
+W tej wersji zastosowali/smy implementacj/e AWK-a stworzon/a w ramach
+inicjatywy GNU: GAWK32.EXE oraz wersj/e Ghostscript-a dla systemu DOS:
+GS386.EXE.
+
+Do test/ow pakietu u/zywali/smy kilku wersji Ghostscripta i GAWK-a.
+Aktualnie u/zywamy ju/z Ghostscripta w wersji 5.10 oraz GAWK 3.0.3.
+(w wersji 32-bitowej -- GAWK32.EXE) i nie zauwa/zyli/smy /zadnych
+problem/ow.
+
+==========================================================================
+ C E P i U N C E P
+==========================================================================
+
+W sk/lad podpakietu CEP wchodz/a DOS-owe pliki wsadowe CEP.BAT i UNCEP.BAT
+oraz programy AWK-owe CEP.AWK i UNCEP.AWK. Po wywo/laniu pliku wsadowego
+najpierw uruchamiany jest AWK, kt/ory przegl/ada dane wej/sciowe, stara si/e
+znale/x/c w nich map/e bitow/a zakodowan/a szesnastkowo i tworzy odpowiedni
+program PostScript-owy. Nast/epnie zostaje uruchomiony Ghostscript, kt/ory
+wykonuj/ac przygotowany w poprzednim kroku program, dokonuje w/la/sciwego
+przetwarzania danych. Przepisuje on te/z oryginaln/a preambu/l/e
+PostScript-ow/a dokonuj/ac w niej tylko kilku zmian; /zadne komentarze DSC
+nie ulegaj/a zmianie.
+
+Je/zeli program nie znajdzie w pliku mapy bitowej albo w trakcie analizy
+struktury pliku powstaj/a jakie/s problemy, CEP poddaje si/e i nie tworzy
+wynikowego EPS-a.
+
+Przed skasowaniem oryginalnej wersji zalecamy sprawdzenie, czy powsta/ly plik
+jest prawid/lowy. W niekt/orych (rzadkich) przypadkach CEP mo/ze b/l/ednie
+rozpozna/c map/e bitow/a. Czasami tak/ze b/l/edy Ghostscript-u mog/a
+powodowa/c powstanie uszkodzonego pliku, wi/ec lepiej zawsze obejrze/c
+go przed usuni/eciem /xr/od/la.
+
+CEP nie tworzy binarnych plik/ow wyj/sciowych, zawsze stosuje kodowanie
+ASCII85 lub szesnastkowe. Wynika to z naszego za/lo/zenia, /ze kompresowane
+CEP-em pliki b/ed/a u/zywane g/l/ownie w /srodowisku TeX-owym z DVIPS-em jako
+sterownikiem PostScript-owym. Niezale/znie od tego za/lo/zenia pliki CEP-owe
+mo/zna u/zywa/c w dowolnych systemach DTP, kt/ore wczytuj/a tak zwane
+,,placeable EPS''. Niestety takie systemy najcz/e/sciej wymagaj/a EPS-/ow
+zawieraj/acych podgl/ad w postaci binarnego TIFF-a, kt/ory mo/ze zosta/c
+/xle przetworzony przez (G)AWK-a.
+
+UNCEP dekompresuje wszystkie pliki stworzone CEP-em pod warunkiem, /ze nie
+zosta/ly one w /zaden spos/ob zmienione. W skompresowanym pliku wyst/epuje
+specjalny komentarz ,,%UNCEPInfo:'', kt/ory zawiera informacje potrzebne do
+dekompresji. Jest on jednak bardzo czu/ly na budow/e pliku. Nawet tak
+nieznaczna zmiana jak dodanie (lub usuni/ecie) linii komentarza powoduje, /ze
+pliku nie daje si/e rozkompresowa/c. Trzeba te/z zwr/oci/c uwag/e na to, /ze
+podstaw/a kompresji jest tu przetwarzanie strumienia danych, czyli ci/agu
+liczb, a nie ci/agu znak/ow, co implikuje, /ze informacja o sposobie /lamania
+wierszy podczas czytania danych szesnastkowych jest tracona. W zwi/azku z tym
+UNCEP nie mo/ze wygenerowa/c pliku identycznego z wej/sciowym. Nie ma to
+/zadnego znaczenia dla PostScript-u, gdy/z jest on ca/lkowicie odporny na
+r/o/zne metody /lamania linii. Niestety niekt/ore programy ,,czytaj/ace''
+pliki EPS z niezrozumia/lych przyczyn wymagaj/a /lamania linii wed/lug
+w/lasnych zasad. Tego typu programy (np. Aldus PhotoStyler) nie odczytaj/a
+zdekompresowanego pliku.
+
+U/ZYCIE CEP-a: cep.bat plik_wej/sciowy plik_wyj/sciowy [opcje]
+ program rozpoznaje nast/epuj/ace opcje:
+ 8 -- kodowanie ASCII85 (domy/slnie)
+ h lub H -- kodowanie HEX (szesnastkowe)
+ r lub R -- kompresja RLE (RunLength) (domy/slnie)
+ l lub L -- kompresja LZW
+ f lub F -- kompresja Flate (niestandardowa!)
+ n lub N -- bez kompresji
+UWAGA: nazwa pliku wyj/sciowego musi by/c r/o/zna od nazwy pliku wej/sciowego
+
+U/ZYCIE UNCEP-a: uncep.bat plik_wej/sciowy plik_wyj/sciowy
+UWAGA: nazwa pliku wyj/sciowego musi by/c r/o/zna od nazwy pliku wej/sciowego,
+ metoda dekompresji jest ustalana na podstawie pliku wej/sciowego.
+
+==========================================================================
+ C O P i U N C O P
+==========================================================================
+
+W sk/lad podpakietu COP wchodz/a DOS-owe pliki wsadowe COP.BAT i UNCOP.BAT
+oraz programy AWK-owe COP.AWK i UNCOP.AWK. COP czyta i odpowiednio koduje
+zupe/lnie niemodyfikowany plik wej/sciowy. Nie przeprowadza on w/la/sciwie
+/zadnej analizy danych PostScript-owych. Jedynym wyj/atkiem jest pr/oba
+odnalezienia komentarza strukturalnego ,,%%BoundingBox:''. Je/sli pr/oba
+si/e powiedzie, jest on do/l/aczany do generowanej preambu/ly, w przeciwnym
+przypadku preambu/la nie zawiera komentarza ,,%%BoundingBox:''.
+
+Pliki wygenerowane przez COP-a s/a czytane przez ka/zdy interpreter
+PostScript-u Level 2.
+
+Przy wywo/laniu UNCOP-a nie trzeba ustawia/c /zadnych opcji, ustala on bowiem
+metod/e dekompresji na podstawie nag/l/owka pliku wej/sciowego. UNCOP,
+w przeciwie/nstwie do UNCEP-a, odtwarza dok/ladnie ka/zdy bit oryginalnego
+pliku. Niestety, z powodu b/l/ed/ow Ghostscript-a usuni/ecie pliku
+/xr/od/lowego przed sprawdzeniem, czy plik wynikowy jest prawid/lowy, mo/ze
+si/e sko/nczy/c niemi/l/a niespodziank/a. Dlatego przed skasowaniem /xr/ode/l
+zalecamy obejrzenie rozkompresowanego pliku pod Ghostscript-em.
+
+COP mo/ze by/c u/zywany do kompresowania wszelkich danych dla r/o/znych
+aplikacji, tak wi/ec zdecydowali/smy si/e w tym przypadku dopu/sci/c
+mo/zliwo/s/c kodowania binarnego. Kompresowane EPS-y niestety nie mog/a
+zawiera/c podgl/adu TIFF-owego, wykorzystywanego przez wiele program/ow
+przetwarzaj/acych grafik/e PostScript-ow/a. Plik wynikowy mo/ze by/c u/zywany
+jako tak zwany placeable EPS bez podgl/adu (preview), mo/zna te/z wczytywa/c
+skompresowane pliki jako tak zwany ,,PostScript interpreted''. Niekiedy si/e
+to udaje, ale nie nale/zy si/e dziwi/c, je/sli si/e to nie powiedzie --
+interpretacja PostScript-u to naprawd/e trudne zadanie.
+
+U/ZYCIE COP-a: cop.bat plik_wej/sciowy plik_wyj/sciowy [opcje]
+ program rozpoznaje nast/epuj/ace opcje:
+ 8 -- kodowanie ASCII85 (domy/slnie)
+ b lub B -- kodowanie binarne
+ h lub H -- kodowanie HEX (szesnastkowe)
+ r lub R -- kompresja RLE (RunLength) (domy/slnie)
+ l lub L -- kompresja LZW
+ f lub F -- kompresja Flate (niestandardowa!)
+ n lub N -- bez kompresji
+UWAGA: nazwa pliku wyj/sciowego musi by/c r/o/zna od nazwy pliku wej/sciowego;
+ kodowanie binarne polega na wy/l/aczeniu jakiegokolwiek kodowania.
+
+U/ZYCIE UNCOP-a: uncop.bat plik_wej/sciowy plik_wyj/sciowy
+UWAGA: nazwa pliku wyj/sciowego musi by/c r/o/zna od nazwy pliku wej/sciowego
+ metoda dekompresji jest ustalana na podstawie pliku wej/sciowego
+
+=============================================================================
+ S T E R T A U W A G O C E P-ie I C O P-ie
+=============================================================================
+
+Poni/zej podajemy rozwi/azania niekt/orych problem/ow napotkanych podczas
+tworzenia pakietu:
+
+ * Nie ma prostej metody znajdowania zakodowanej szesnastkowo mapy bitowej
+ w pliku EPS. Analiza semantyczna (do zrealizowania przez przedefiniowanie
+ instrukcji ,,image'', ,,imagemask'' i ,,colorimage'') jest bardzo trudna
+ do pe/lnej realizacji (parametry w postaci s/lownik/ow). Zdecydowali/smy
+ si/e wi/ec na wyszukiwanie mapy bitowej oparte na analizie sk/ladni --
+ to z kolei wywo/la/lo k/lopoty z analiz/a napis/ow ,,add'' oraz ,,def'',
+ kt/ore mog/a by/c zar/owno cz/e/sci/a mapy bitowej, jak i instrukcj/a
+ PostScript-ow/a.
+
+ * Nie da si/e tak/ze poda/c dok/ladnych wytycznych, kt/ora metoda kompresji
+ b/edzie najlepsza dla konkretnych danych. Zwykle najlepsz/a metod/a
+ kodowania jest ASCII85. Dla map bitowych (kompresowanych CEP-em)
+ najcz/e/sciej wystarczy algorytm RLE, cho/c dla kolorowych rysunk/ow
+ lepszy jest LZW. Najlepsze wyniki prawie zawsze daje metoda Flate.
+ Jednak Flate, jak r/ownie/z LZW maj/a ograniczone zastosowania:
+ (a) kompresja LZW zosta/la w wersjach 4.x Ghostscript-u wy/l/aczona
+ z powodu nieszcz/esnego patentu (p. ,,S/lowniczek'' zamieszczony
+ na ko/ncu). Aladdin zastosowa/l zast/epczo filtr koduj/acy
+ zgodny z LZW, kt/ory niestety nie kompresuje danych (a nawet
+ je zwi/eksza o 10%). Mo/zna u/zywa/c starszych wersji
+ Ghostscript-a (maj/a one kilka b/l/ed/ow) lub skompilowa/c
+ GS z filtrem LZW na w/lasn/a odpowiedzialno/s/c, ale...
+ (b) kompresja Flate na razie niestety nie jest dost/epna
+ w fotona/swietlarkach. Po prostu nie wchodzi w sk/lad specyfikacji
+ PostScript-u Level 2. Jest nadzieja, /ze kiedy/s ten stan si/e
+ zmieni i algorytm Flate (taki sam jak u/zywany w GZIP-ie)
+ wejdzie do specyfikacji j/ezyka. W dokumentacji Ghostscript-a
+ znajdujemy bowiem zdanie (w wolnym t/lumaczeniu):
+ ,,Ghostscript obs/luguje r/ownie/z nieudokumentowane
+ filtry FlateEncode and FlateDecode, zawarte
+ w specyfikacji formatu PDF 1.2 oraz (przypuszczalnie)
+ PostScript-u poziomu trzeciego''
+ Z naszych do/swiadcze/n wynika, /ze w przypadku skan/ow zdj/e/c
+ najlepsze wyniki daje wy/l/aczenie kompresji i stosowanie tylko kodowania
+ ASCII85. W przypadku takich danych /zadna bezstratna metoda kompresji
+ nie jest w stanie nic zmieni/c (zdj/ecia zawieraj/a du/zo informacji
+ szumowej). Nawet takie programy jak ARJ, ZIP czy LHARC nie dadz/a
+ istotnie lepszych wynik/ow. Jedyn/a mo/zliwo/sci/a jest kompresja
+ fotografii algorytmami stratnymi, takimi jak stosowany w plikach JPEG
+ algorytm DCT.
+
+ * Zgodnie z tym co powiedzieli/smy wy/zej, najcz/e/sciej polecane jest
+ stosowanie kodowania ASCII85, niestety wywo/luje ono pewne problemy.
+ Po pierwsze, aby omin/a/c b/l/ad Ghostscript-a (nadmiarowe znaczniki
+ ko/nca danych), musieli/smy u/zy/c dodatkowego, pustego filtru
+ NullEncode. Pojawia si/e niestety r/ownie/z drugi powa/zniejszy problem:
+ dane zakodowane filtrem ASCII85 mog/a zawiera/c linie, kt/ore do/s/c
+ skutecznie podszywaj/a si/e pod komentarze strukturalne. Mianowicie
+ rozpoczynaj/a si/e od dw/och znak/ow procenta ,,%%'' lub od procenta
+ i wykrzyknika ,,%!''. W tym kontek/scie wydaje si/e dziwne, /ze firma
+ Adobe nie zdecydowa/la si/e na usuni/ecie procenta z zestawu znak/ow
+ ASCII85. Niestety nie uczyni/la tego, wi/ec niekt/ore programy
+ u/zywaj/ace plik/ow EPS, mog/a pr/obowa/c przetwarza/c linie zawieraj/ace
+ takie ,,niby-komentarze''. DVIPS jest tego przyk/ladem -- standardowo
+ usuwa linie komentarzy z wczytywanych plik/ow. Mo/zna zablokowa/c t/e
+ funkcj/e (-K0), ale wtedy pozostaj/a r/ownie/z prawdziwe komentarze
+ DSC, kt/ore mog/a powodowa/c b/l/edy w analizie dokumentu przez programy
+ korzystaj/ace z konwencji DSC.
+
+ * Przydatne mog/loby by/c w/l/aczenie do pakietu jeszcze kilku standardowych
+ filtr/ow PostScript-u, na przyk/lad DCT oraz CCITTFax. Jednak filtry te
+ wymagaj/a podania wielu parametr/ow wej/sciowych, wi/ec korzystanie z nich
+ by/loby du/zo bardziej skomplikowane. Co wi/ecej, w/la/sciwie nie wiadomo,
+ jak mo/zna ustala/c parametry kompresji DCT, nie maj/ac mo/zliwo/sci
+ interakcyjnego korygowania efekt/ow. Na razie wi/ec nie oprogramowali/smy
+ tych filtr/ow. W zamian przygotowujemy programik umo/zliwiaj/acy
+ konwersj/e plik/ow JPEG (czyli bardzo mocno skompresowanych bitmap)
+ do postaci PostScript-owych EPS-/ow (u/zywaj/acych filtra DCT).
+
+ * W pakiecie CEP starali/smy si/e oszcz/ednie gospodarowa/c przestrzeni/a
+ dyskow/a. W czasie pracy nie s/a tworzone /zadne du/ze pliki tymczasowe;
+ w/la/sciwie do kompresji pliku potrzebne jest tyle wolnego miejsca na
+ dysku, ile zajmuje plik wynikowy.
+
+ * W czasie p/o/lrocznej eksploatacji pakietu okaza/lo si/e, /ze
+ w wypadku niekt/orych komercyjnych urz/adze/n PostScript-owych
+ zgodno/s/c z standardem PostScript Level 2 ko/nczy si/e na
+ efektownych ulotkach i nalepce na obudowie. Cz/e/s/c na/swietlarek
+ (zw/laszcza starszych) nie jest w stanie, mimo obietnic producent/ow,
+ przetwarza/c poprawnie plik/ow *.ps zawieraj/acych operacje zwi/azane
+ z obiektami typu filter.
+
+ Jedyn/a metod/a sprawdzenia czy dana na/swietlarka prawid/lowo
+ realizuje wymienione filtry jest niestety metoda pr/ob i b/l/ed/ow.
+ W wypadku korzystania z na/swietlarki, kt/ora odmawia wsp/o/lpracy
+ z pakietem CEP (czyli nie jest zgodna z PostScript-em Level 2),
+ mo/zemy: (a) zmieni/c na/swietlarni/e, (b) wymusi/c na na/swietlarni
+ zakup nowego urz/adzenia, lub ewentualnie uaktualnienia
+ oprogramowania na/swietlarki (w przypadku RIP-a programowego)
+ lub (c) zrezygnowa/c z u/zywania CEP-a.
+
+ Pomocny mo/ze okaza/c si/e tu kr/otki plik PostScript-owy:
+
+ %!PS-Adobe-2.0 EPSF-1.2
+ %%Pages: 1
+ %%BoundingBox: 0 0 540 150
+ %%EndComments
+ /Helvetica 8 selectfont
+ 90 rotate
+ 1 2 moveto
+ (*)
+ {0 -10 rmoveto gsave show grestore}
+ 255 string
+ /Filter
+ resourceforall
+ showpage
+ %%EOF
+
+ Program ten spowoduje wypisanie listy filtr/ow obs/lugiwanych przez
+ dany interpreter. Je/sli w czasie przetwarzania pojawia si/e b/l/ad
+ (obs/luga w studiu graficznym twierdzi, /ze ,,plik si/e nie
+ RIP-uje''), to najprawdopodobniej mamy do czynienia ze zbyt ubog/a
+ wersj/a PostScript-u i musimy zrezygnowa/c z u/zywania CEP-a.
+
+ Powy/zszy plik mo/zna albo bezpo/srednio wys/la/c na urz/adzenie
+ PostScript-owe (na/swietlark/e, drukark/e), albo umie/sci/c
+ w dokumencie TeX-owym jak zwyk/ly plik EPS.
+
+ * B/l/edy i pu/lapki:
+
+ (a) Poprzedzenie komendy ,,closefile'' teoretycznie nadmiarow/a komend/a
+ ,,flushfile'' pozwala omin/a/c pluskw/e w GS 3.x (zjadanie ko/nc/owki
+ pliku wyj/sciowego).
+
+ (b) Dodatkowy, pusty filtr NullEncode pozwala nam omin/a/c (prawdopodobnie)
+ pewn/a pluskw/e Ghostscript-a. Mianowicie filtr ASCII85 z wyj/sciem
+ danych skierowanym do procedury cz/esto zapisuje w strumieniu
+ wynikowym dodatkowe znaczniki ko/nca danych, czyli ~> (przy pewnych
+ parametrach mo/ze zapisa/c ich tysi/ace). Skierowanie danych
+ wyj/sciowych do procedury, zamiast bezpo/srednio do pliku niestety
+ uniemo/zliwia stosowanie wcze/sniejszych ni/z 3.x wersji
+ Ghostscript-a przy kodowaniu ASCII85. Na szcz/e/scie GS w wersji
+ od 2.6x mo/ze by/c stosowany przynajmniej do kodowania szesnastkowego
+ (HEX) -- ta wersja Ghostscript-a zawiera r/ownie/z ,,legaln/a''
+ kompresj/e LZW.
+
+ (c) Procedura docelowa, o kt/orej pisali/smy w punkcie (b), zosta/la
+ dodana, aby specjalnie zmodyfikowa/c wiersze, kt/ore mog/lyby by/c
+ b/l/ednie zinterpretowane jako komentarze DSC. Specjalne traktowanie
+ polega na prze/lamaniu wiersza po znaku procenta. Zabezpiecza to
+ przed konsekwencjami cz/esto stosowanej, a w tym wypadku bardzo
+ gro/xnej opcji DVIPS-a ,,usuwaj komentarze'' (-K1).
+
+ (d) Dziwaczna sk/ladnia komendy ,,{2 2 .quit}'' zamiast formy
+ ,,{2 .quit}'' zosta/la zastosowana z powodu b/l/edu w GS 3.5x,
+ kt/ory wpada/l w niesko/nczon/a p/etl/e. Wewn/etrzn/a instrukcj/e
+ Ghostscript-a ,,.quit'' wybrali/smy po to, by umo/zliwi/c obs/lug/e
+ b/l/ed/ow na poziomie systemu operacyjnego.
+
+ (e) W starszych wersja Ghostscript-a wyst/epuje jeszcze jeden dziwny
+ b/l/ad, kt/orego nie uda/lo si/e nam omin/a/c. Mianowicie niekt/ore
+ EPS-y s/a poprawnie kompresowane przez GS 2.6, ale ta sama wersja
+ Ghostscript-a nie potrafi ich wy/swietli/c. Podobne objawy
+ obserwowali/smy w przypadku innego pliku w wersji 3.51 Ghostscript-a.
+ Oczywi/scie takie pliki daj/a si/e bez problemu odczyta/c w wy/zszych
+ wersjach GS-a. Jak na razie Ghostscript w wersji 4.03 zachowuje
+ si/e w spos/ob najbardziej stabilny, je/sli chodzi o filtrowanie
+ danych. Gdyby nie /ow nieszcz/esny patent na LZW... No i mo/ze
+ jeszcze k/lopoty z obs/lug/a pami/eci map bitowych (cache?).
+
+ (f) Podsumowuj/ac, stanowczo polecamy stosowanie Ghostscript-a
+ w wersji 4.x lub 5.x (ewentualnie z dokompilowanym algorytmem LZW)
+ oraz GAWK-a w wersji 3.x. GS 4.x jest praktycznie pe/ln/a
+ implementacj/a poziomu drugiego (Level 2) PostScript-u.
+ GAWK 3.x umo/zliwia stosowanie wyra/ze/n regularnych jako
+ separator/ow rekord/ow, co pozwala z kolei na obs/lugiwanie
+ znak/ow ko/nca linii w spos/ob dok/ladnie zgodny z specyfikacj/a
+ PostScript-u. Wersja 3.x GAWK-a jest tak/ze znacznie stabilniejsza
+ od wersji poprzednich.
+
+==========================================================================
+ H I S T O R I A
+==========================================================================
+
+CEP+UNCEP:
+ 0.10 -- 16.03.97 -- pierwsza wersja
+ 0.20 -- 05.04.97 -- usuni/eto kilka wykrytych b/l/ed/ow
+ 0.30 -- 11.04.97 -- wprowadzono now/a metod/e modyfikacji preambu/ly
+ (umo/zliwi/lo to przetwarzanie skomplikowanych
+ prolog/ow), /l/aczenie plik/ow wyj/sciowych
+ przeniesione na poziom PostScript-u (szybsze
+ przetwarzania i mniejsze zu/zycie przestrzeni
+ dyskowej)
+ 0.35 -- 13.04.97 -- dodano komentarze (wersja dwuj/ezyczna)
+ 0.40 -- 14.04.97 -- znacz/aco poprawiono szybko/s/c dzia/lania
+ 0.50 -- 15.04.97 -- /la/ncuchy alokowane s/a statycznie, nie s/a tworzone
+ pliki po/srednie (poprawa szybko/sci dzia/lania
+ oraz zmniejszenie potrzebnej przestrzeni dyskowej)
+ 0.60 -- 19.04.97 -- dodano obs/luge b/l/ed/ow w PostScript-cie,
+ omini/eto kilka b/l/ed/ow GS-a
+ 0.65 -- 20.04.97 -- dodano kod wyj/scia, powsta/la te/z dokumentacja
+ 0.70 -- 21.04.97 -- pierwsza wersja UNCEP-a
+ 0.75 -- 24.04.97 -- usuni/eto k/lopoty z r/o/znymi wersjami ko/nc/ow
+ linii, oraz znacznikiem ko/nca danych szesnastkowych;
+ zebrano i przet/lumaczono dokumentacj/e
+ 1.00 -- 02.05.97 -- bezp/latne udost/epnienie (BachoTeX '97)
+ 1.03 -- 07.01.98 -- uzupe/lnienie dokumentacji, poprawienie odporno/sci
+ pakietu na egzotyczne dane (CEP.AWK)
+
+COP+UNCOP:
+ 0.10 -- 06.04.97 -- pierwsza wersja
+ 0.20 -- 12.04.97 -- budowa programu zosta/la ujednolicona z CEP-em,
+ wstawiono "cvx exec" zamiast b/l/ednego "run"
+ 0.25 -- 13.04.97 -- dodano komentarze (wersja dwuj/ezyczna)
+ 0.30 -- 15.04.97 -- /la/ncuchy alokowane s/a statycznie (znacz/aca
+ poprawa szybko/sci)
+ 0.40 -- 19.04.97 -- dodano obs/luge b/l/ed/ow w PostScript-cie,
+ omini/eto kilka b/l/ed/ow GS-a
+ 0.45 -- 20.04.97 -- dodano kod wyj/scia, powsta/la dokumentacja
+ 0.50 -- 24.04.97 -- usuni/eto k/lopoty z r/o/znymi wersjami ko/nc/ow
+ linii; zebrano i przet/lumaczono dokumentacj/e
+ 1.00 -- 02.05.97 -- bezp/latne udost/epnienie (BachoTeX '97)
+ 1.03 -- 07.01.98 -- uzupe/lnienie dokumentacji, poprawienie odporno/sci
+ pakietu na egzotyczne dane (CEP.AWK)
+
+==========================================================================
+ S /L O W N I C Z E K
+==========================================================================
+
+Ghostscript, GS -- wspania/ly interpreter j/ezyka PostScript, stworzony
+ przez Aladdin Enterprise, dost/epny bezp/latnie na zasadach
+ ,,free public license''; aktualna wersja jest cz/esto lepsza
+ i bardziej stabilna od sprzedawanych za tysi/ace dolar/ow
+ interpreter/ow fotona/swietlarek.
+AWK -- program narz/edziowy, a tak/ze j/ezyk programowania umo/zliwiaj/acy
+ skuteczne i /latwe do zaprogramowania przetwarzania wsadowe
+ plik/ow tekstowych, stworzony w 1977 r. przez Alfreda V. Aho,
+ Petera J. Weinbergera i Briana W. Kernighana.
+GAWK -- Gnu AWK -- dost/epna bezp/latnie na zasadach ,,GNU Free Software
+ Foundation'' implementacja AWK-a, napisana w 1986 r. przez
+ Paula Rubina oraz Jay Fenlasona z pomoc/a Richarda Stallmana.
+GNU -- inicjatywa ,,The Free Software Foundation'' niekomercyjnej
+ organizacji zajmuj/acej si/e tworzeniem i rozpowszechnianiem
+ darmowego oprogramowania. Fundacj/e za/lo/zy/l Richard M. Stallman.
+TeX -- system komputerowego sk/ladu tekstu, stworzony przez
+ Donalda E. Knutha z Uniwersytetu Stanforda, rozpowszechniany
+ jako dobro publiczne.
+DVIPS -- program tworz/acy pliki PostScript-owe z TeX-owych plik/ow DVI,
+ autorstwa Tomasa Rokickiego z Uniwersytetu Stanforda.
+DSC -- Document Structuring Convention -- wyznaczony przez firm/e Adobe
+ standard strukturyzacji plik/ow PostScript-owych.
+ASCII85 -- algorytm kodowania danych binarnych w postaci tekstowej.
+ Koduje ka/zde cztery bajty jako pi/e/c znak/ow z zakresu od ,,%''
+ do ,,u''; cztery bajty zerowe s/a traktowane inaczej i kodowane
+ jako litera ,,z'' (szczeg/o/ly w dokumentacji j/ezyka PostScript,
+ strony 128--130).
+RLE -- run length encoding (kodowanie powtarzaj/acych si/e bajt/ow) --
+ standardowa metoda kompresji danych (szczeg/o/ly w dokumentacji
+ j/ezyka PostScript, strony 133--134).
+LZW -- algorytm kompresji wymy/slony w 1978 roku przez J. Ziva i A. Lempela,
+ poprawiony przez T. Welcha w 1984 r.; w 1985 roku opatentowany
+ w Stanach Zjednoczonych przez firm/e Unisys, zatrudniaj/ac/a Welcha.
+ Firma Unisys uzna/la, /ze implementacje algorytmu sprzed roku 1985
+ s/a wolne od op/laty autorskiej. (Informacja zaczerpni/eta
+ z opracowania Nelsona H. F. Beebe, e-mail beebe@math.utah.edu.)
+DCT -- discrete cosine transform compression (kompresja oparta
+ o numeryczn/a transformat/e kosinusow/a) -- bardzo efektywna,
+ stratna metoda kompresji danych (g/l/ownie graficznych).
+JPEG -- Joint Photographic Experts Group -- organizacja, kt/ora stworzy/la
+ b/ed/acy standardem format zapisu plik/ow oparty na kompresji
+ algorytmem DCT. Filtr PostScript-owy ,,DCTEncoding''
+ jest zgodny ze standardem JPEG.
+GZIP -- program kompresuj/acy stworzony przez GNU Free Software Foundation
+ jako odpowied/x na opatentowanie algorytmu LZW, oparty na bardzo
+ skutecznym i og/olnie dost/epnym algorytmie (wariant algorytmu
+ Lempela i Ziva). Jest on obecnie standardowym narz/edziem kompresji
+ danych w systemach unixowych.
+Flate -- filtr PostScript-u Level 3 wykorzystuj/acy kompresj/e opart/a
+ o ten sam algorytm, kt/ory u/zywany jest przez program GZIP;
+ nazwa pochodzi od angielskich s/l/ow deflate-inflate.
+=======================================================================
+KONIEC ,,CEPCOP_P.INF''
+
diff --git a/support/pstools/cep/cop.awk b/support/pstools/cep/cop.awk
new file mode 100644
index 0000000000..3be8f491a9
--- /dev/null
+++ b/support/pstools/cep/cop.awk
@@ -0,0 +1,143 @@
+# This file belongs to the CEP package | Ten plik nale/zy do pakietu CEP
+# This package is public domain | Pakiet stanowi dobro powszechne
+# For more info see `0CEP_LIC.ENG' | Wi/ecej informacji w ,,0CEP_LIC.POL''
+# ===========================================================================
+# E: "PS" --> "filtered PS" converter
+# input - input file name
+# OUTF - output file name
+# CVM - conversion method
+# TMPSX - temporary PostScript file name
+#
+# P: Konwerter "PS" --> "filtered PS"
+# wej/scie - nazwa pliku konwertowanego
+# OUTF - nazwa pliku wyj/sciowego
+# CVM - metoda konwersji PS-a
+# TMPSX - nazwa tymczasowego pliku PostScriptowego
+
+BEGIN {
+ ver_no=1.03
+ gs_abort="2 2 .quit"
+ RS="\015|\012|\015\012"
+ # preparing temporary files | przygotowywanie plik/ow tymczasowych
+ if (TMPSX=="") TMPSX="tmp.psx"
+ if (CVM!~/[LlRrFfNn]/) CVM=CVM "R" # Default coding and compression method
+ if (CVM!~/[BbHh8]/) CVM=CVM "8" # Domy/slna metoda kodowania i kompresji
+ printf "COP ver. " ver_no ", coding:"
+ if (is_A85()) printf " A85"
+ if (is_HEX()) printf " Hex"
+ if (is_BIN()) printf " Bin"
+ if (is_LZW()) printf ", LZW"
+ if (is_RLE()) printf ", RLE"
+ if (is_ZIP()) printf ", Flate (non-standard in PostScript Level 2!)"
+ print ""
+}
+
+NR==1 && /^%!PS-Adobe/ {hdline=$0}
+
+/^%%BoundingBox:/ {bbline=$0; if (/\(atend\)/) flag=1; if (!flag) exit}
+
+END {
+ # WRITE PostScript ENCODING PROGRAM | TWORZENIE PROGRAMU Postscript-owego
+ out_ps_errorhandler()
+ # create preamble | tworzenie preambu/ly
+ out_ps("(" ps_fname(OUTF) ") (w) file /w_file exch def")
+ out_ps("(" ps_fname(FILENAME) ") (r) file /r_file exch def")
+ out_ps("/p_string 4096 string def")
+ out_ps("/b_string 4096 string def")
+ out_ps("/flushclose {dup flushfile closefile} def")
+ if (hdline=="") hdline="%!PS-Adobe-3.0"
+ hdline=hdline " COP-" ver_no
+ out_ps("w_file (" hdline "\\n) writestring")
+ if (bbline!="") out_ps("w_file (" bbline "\\n) writestring")
+ out_ps("w_file (" banner() "\\n) writestring")
+ out_ps("w_file (" source() "\\n) writestring")
+ # special treatment of the ASCII85 encoded lines looking like DSC comments
+ # dodatkowa obr/obka wierszy (zakodowanych jako ASCII85) zaczynaj/acych
+ # si/e tak jak komentarze DSC
+ if (is_A85()) {
+ out_ps("{pop (%) anchorsearch {pop w_file (%\\n ) writestring} if")
+ out_ps(" {(\n%) search not {exit} if")
+ out_ps(" w_file exch writestring pop w_file (\\n%\\n ) writestring} loop")
+ out_ps(" w_file exch writestring p_string}")
+ out_ps("/NullEncode filter dup")
+ } else out_ps("w_file")
+ # prepare encoding filters | przygotowywanie filtr/ow koduj/acych
+ if (is_A85()) out_ps("/ASCII85Encode filter")
+ if (is_HEX()) out_ps("/ASCIIHexEncode filter")
+ if (is_LZW()) out_ps("dup /LZWEncode filter")
+ if (is_RLE()) out_ps("dup 0 /RunLengthEncode filter")
+ if (is_ZIP()) out_ps("dup /FlateEncode filter")
+ # loop encoding bitmap | p/etla koduj/aca map/e bitow/a
+ out_ps("{r_file b_string readstring not")
+ out_ps("exch 2 index exch writestring")
+ out_ps("{exit} if} loop")
+ if (is_A85()) out_ps("flushclose flushclose")
+ if (is_HEX()) out_ps("flushclose")
+ if (is_LZW()) out_ps("flushclose")
+ if (is_RLE()) out_ps("flushclose")
+ if (is_ZIP()) out_ps("flushclose")
+ # create postamble | tworzenie postambu/ly
+ out_ps("w_file (\\n%%EOF) writestring")
+ out_ps("w_file flushclose r_file closefile quit")
+ printf "."
+}
+
+
+function banner() {return "%%Creator: COP ver. " ver_no " by BOP s.c."}
+
+function ps_fname(s) {gsub(/\\/,"/",s); return(s)}
+
+function out_ps(s) {print s > TMPSX}
+
+function out_ps_errorhandler() {
+ out_ps("/errq {" gs_abort "} def")
+ out_ps("errordict begin ")
+ out_ps("/typecheck {255 string cvs (filter) search")
+ out_ps(" {(\\010!Filter failed) print")
+ out_ps(" ( (ASCII85Encode used with GS version<3.0?)\\n\\007) print}")
+ out_ps(" {(\\010!Something went wrong\\n Error: typecheck\\n\\007) print}")
+ out_ps(" ifelse errq} def")
+ out_ps("/ioerror {(\\010!Input/Output error occurred. (Disk full?)\\n\\007)")
+ out_ps(" print errq} def")
+ out_ps("/handleerror {$error begin (Something went wrong) print")
+ out_ps(" (\\n Error: ) print errorname 255 string cvs print")
+ out_ps(" (\\n\\007) print end errq} def")
+ out_ps("end")
+ #
+ out_ps("systemdict /resourcestatus known not")
+ out_ps("{(\\010!This version of Ghostscript doesn't support required Level 2 features\\n\\007)")
+ out_ps(" print quit} if")
+ if (is_A85()) {
+ check_filter("ASCII85Encode", "ASCII85Encode filter")
+ check_filter("NullEncode", "required Level 2 filters")
+ }
+ if (is_HEX()) check_filter("ASCIIHexEncode", "ASCIIHexEncode filter")
+ if (is_LZW()) check_filter("LZWEncode", "LZWEncode filter")
+ if (is_RLE()) check_filter("RunLengthEncode", "RunLengthEncode filter")
+ if (is_ZIP()) check_filter("FlateEncode", "FlateEncode filter")
+}
+ function check_filter(name, expl) {
+ out_ps("/" name " /Filter resourcestatus {pop pop}")
+ out_ps("{(\\010!This version of Ghostscript doesn't support " expl "\\n\\007)")
+ out_ps(" print errq} ifelse")
+ }
+
+ # searching for the most recent, i.e., active, options
+ # poszukiwanie ostatniej (obowi/azuj/acej) opcji
+function is_BIN() {return (CVM~/[Bb][^Hh8]*$/) }
+function is_A85() {return (CVM~/8[^HhBb]*$/) }
+function is_HEX() {return (CVM~/[Hh][^8Bb]*$/) }
+function is_LZW() {return (CVM~/[Ll][^NnRrFf]*$/) }
+function is_RLE() {return (CVM~/[Rr][^NnLlFf]*$/) }
+function is_ZIP() {return (CVM~/[Ff][^NnLlRr]*$/) }
+
+function source() {
+ s="currentfile"
+ if (is_A85()) s=s " /ASCII85Decode filter"
+ if (is_HEX()) s=s " /ASCIIHexDecode filter"
+ if (is_LZW()) s=s " /LZWDecode filter"
+ if (is_RLE()) s=s " /RunLengthDecode filter"
+ if (is_ZIP()) s=s " /FlateDecode filter"
+ s=s " cvx exec"
+ return s
+}
diff --git a/support/pstools/cep/cop.bat b/support/pstools/cep/cop.bat
new file mode 100644
index 0000000000..4657326d10
--- /dev/null
+++ b/support/pstools/cep/cop.bat
@@ -0,0 +1,49 @@
+:: This file belongs to the CEP package | Ten plik nale/zy do pakietu CEP
+:: This package is public domain | Pakiet stanowi dobro powszechne
+:: For more info see `0CEP_LIC.ENG' | Wi/ecej informacji w ,,0CEP_LIC.POL''
+:: ===========================================================================
+:: E: PS file compression program
+:: This program compresses any PS file using Postscript Level 2 methods.
+::
+:: P: Program do kompresji plik/ow PS.
+:: S/lu/zy on do pakowania oraz kodowania dowolnych plik/ow
+:: PostScriptowych za pomoc/a standardowych algorytm/ow
+:: Postscript-u Level 2.
+::
+@echo off
+if "%2"=="" goto USAGE
+if "%1"=="%2" goto USAGE
+if not exist %1 goto USAGE
+gawk32 -fcop.awk -vTMPSX=tmp.psx -vOUTF=%2 -vCVM=%3%4 %1
+if errorlevel==1 goto DONE
+SET DOS4G=quiet
+if exist tmp.psx call gs386.exe -q -dNODISPLAY tmp.psx
+if exist tmp.psx del tmp.psx
+echo .
+goto DONE
+::
+:USAGE
+echo E: USAGE:
+echo cop input_file output_file [options]
+echo the program recognizes the following options:
+echo 8 -- use ASCII85 coding (default)
+echo b or B -- use binary coding
+echo h or H -- use HEX (hexadecimal) coding
+echo r or R -- use RLE (RunLength) compression (default)
+echo l or L -- use LZW compression
+echo f or F -- use Flate compression (non-standard!)
+echo n or N -- don't compress
+echo (names of input_file and output_file must differ)
+echo.
+echo P: WYWO/LANIE:
+echo cop plik_wej/sciowy plik_wyj/sciowy [opcje]
+echo program rozpoznaje nast/epuj/ace opcje:
+echo 8 -- kodowanie ASCII85 (domy/slnie)
+echo b lub B -- kodowanie binarne
+echo h lub H -- kodowanie HEX -- szesnastkowe
+echo r lub R -- kompresja RLE -- RunLength (domy/slnie)
+echo l lub L -- kompresja LZW
+echo f lub F -- kompresja Flate (niestandardowa!)
+echo n lub N -- bez kompresji
+echo (nazwa pliku wyj/sciowego musi by/c r/o/zna od nazwy pliku wej/sciowego)
+:DONE
diff --git a/support/pstools/cep/uncep.awk b/support/pstools/cep/uncep.awk
new file mode 100644
index 0000000000..c9f79995ed
--- /dev/null
+++ b/support/pstools/cep/uncep.awk
@@ -0,0 +1,140 @@
+# This file belongs to the CEP package | Ten plik nale/zy do pakietu CEP
+# This package is public domain | Pakiet stanowi dobro powszechne
+# For more info see `0CEP_LIC.ENG' | Wi/ecej informacji w ,,0CEP_LIC.POL''
+# ===========================================================================
+# E: "CEP filtered EPS" --> "EPS" converter
+# input - input file name
+# OUTF - output file name
+# TMPSX - temporary PostScript file name
+#
+# P: Konwerter "CEP filtered EPS" --> "EPS"
+# wej/scie - nazwa pliku konwertowanego
+# OUTF - nazwa pliku wyj/sciowego
+# TMPSX - nazwa tymczasowego pliku PostScriptowego
+
+BEGIN {# preparing temporary files | przygotowywanie plik/ow tymczasowych
+ ver_no=1.03
+ gs_abort="2 2 .quit"
+ chop_EOD=1
+ if (TMPSX=="") TMPSX="tmp.psx"
+ flag="begin"
+}
+
+ # check carefully whether the file to be processed was created by CEP
+ # sprawd/xmy staranne czy mamy do czynienia z plikiem stworzonym przez CEP-a
+
+{l=$0 "\n"} # l is a candidate for a prolog line
+flag~"begin" && /^%%Creator: CEP/ {flag="cep"; l=""} # ignore CEP comment
+flag~"cep" && /^%UNCEPInfo:/ && NF==5 {
+ # store CEP data, ignore CEP comment
+ pre_lines=0+$2; buff_num=0+$3; buff_len=0+$4; pos_lines=0+$5
+ flag="uncep"; l=""
+}
+flag~"uncep" && /^\/_fltrd_file currentfile .+ \/_read_string .+ def$/ {
+ # store CEP decoding scheme, ignore CEP line
+ decodeline=$0; flag="good"; l=""
+}
+{prolog=prolog l} # lengthen prolog
+flag!~"uncep|good" && /^[^%]/ {exit} # emergency exit (CEP comment not found
+ # in DSC comment block)
+flag~"uncep|good" && NR==pre_lines {exit} # exit after prolog
+
+END {
+ # error handling | obs/luga b/l/ed/ow
+ if (flag!~"good") errmessage("not a CEP file",1)
+ if (!is_A85() && !is_HEX())
+ errmessage("CEP file was modified (strange coding), can't uncompress",4)
+ printf "UNCEP ver. " ver_no ", decoding:"
+ if (is_A85()) printf " A85"
+ if (is_HEX()) printf " Hex"
+ if (is_LZW()) printf ", LZW"
+ if (is_RLE()) printf ", RLE"
+ if (is_ZIP()) printf ", Flate"
+ print ""
+
+ # restore preamble of EPS file
+ # odtworzenie preambu/ly pliku EPS
+
+ if (gsub(/_fltrd_file/,"currentfile",prolog)==0)
+ errmessage("CEP file was modified, can't uncompress",4)
+ if (gsub(/_read_string/,"readhexstring",prolog)==0)
+ errmessage("CEP file was modified, can't uncompress",4)
+ gsub(/%/,"%%",prolog) # neutralizing printf | podmiana dla printf
+
+ # WRITE PostScript ENCODING PROGRAM | TWORZENIE PROGRAMU Postscript-owego
+ out_ps("(" ps_fname(OUTF) ") (w) file /w_file exch def")
+ out_ps("(" ps_fname(FILENAME) ") (r) file /r_file exch def")
+ out_ps("/l_string 255 string def")
+ out_ps("/p_string 4096 string def")
+ out_ps("/b_string " buff_len " string def")
+ out_ps("/flushclose {dup flushfile closefile} def")
+ # copy preamble | przepisywanie preambu/ly
+ out_ps(pre_lines " {r_file l_string readline pop pop} repeat")
+ out_ps(pre_lines-3 " {currentfile l_string readline pop")
+ out_ps("w_file exch writestring w_file (\\n) writestring} repeat")
+ out_ps_block(prolog)
+ out_ps("%--- PROLOG END | KONIEC PROLOGU")
+ # prepare decoding | przygotowywanie filtr/ow dekoduj/acych
+ if (is_A85()) out_ps("r_file /ASCII85Decode filter")
+ if (is_HEX()) out_ps("r_file /ASCIIHexDecode filter")
+ if (is_LZW()) out_ps("dup /LZWDecode filter")
+ if (is_RLE()) out_ps("dup /RunLengthDecode filter")
+ if (is_ZIP()) out_ps("dup /FlateDecode filter")
+ out_ps("/d_file exch def")
+ if (chop_EOD) {# remove EOD mark
+ out_ps("{not {dup length 1 sub 0 exch getinterval} if")
+ out_ps(" w_file exch writestring p_string}")
+ } else out_ps("w_file")
+ out_ps("/ASCIIHexEncode filter")
+ # loop decoding the EPS file | p/etla dekoduj/aca plik EPS
+ out_ps(buff_num " {dup d_file b_string")
+ out_ps(" readstring pop writestring} repeat")
+ out_ps("flushclose d_file closefile")
+ if (is_LZW() || is_RLE() || is_ZIP()) out_ps("closefile")
+ # copy postamble | przepisanie postambu/ly
+ out_ps(pos_lines+1 " {r_file l_string readline pop")
+ out_ps("w_file exch writestring w_file (\\n) writestring} repeat")
+ out_ps("w_file flushclose r_file closefile quit")
+ printf "."
+}
+
+function ps_fname(s) {gsub(/\\/,"/",s); return(s)}
+
+function out_ps(s) {print s > TMPSX}
+function out_ps_block(block) {printf block > TMPSX}
+
+function out_ps_errorhandler() {
+ out_ps("/errq {" gs_abort "} def")
+ out_ps("errordict begin ")
+ out_ps("/ioerror {(\\010!Input/Output error occurred. (Disk full?)\\n\\007)")
+ out_ps(" print errq} def")
+ out_ps("/handleerror {$error begin (Something went wrong) print")
+ out_ps(" (\\n Error: ) print errorname 255 string cvs print")
+ out_ps(" (\\n\\007) print end errq} def")
+ out_ps("end")
+ #
+ out_ps("systemdict /resourcestatus known not")
+ out_ps("{(\\010!This version of Ghostscript doesn't support required Level 2 features\\n\\007)")
+ out_ps(" print quit} if")
+ if (is_A85()) check_filter("ASCII85Decode", "ASCII85Decode filter")
+ if (is_HEX()) check_filter("ASCIIHexDecode", "ASCIIHexDecode filter")
+ if (is_LZW()) check_filter("LZWDecode", "LZWDecode filter")
+ if (is_RLE()) check_filter("RunLengthDecode", "RunLengthDecode filter")
+ if (is_ZIP()) check_filter("FlateDecode", "FlateDecode filter")
+}
+ function check_filter(name, expl) {
+ out_ps("/" name " /Filter resourcestatus {pop pop}")
+ out_ps("{(\\010!This version of Ghostscript doesn't support " expl "\\n\\007)")
+ out_ps(" print errq} ifelse")
+ }
+
+function errmessage(errname, errnum) {
+ print "UNCEP ERROR:", errname "\007"; exit(errnum)
+}
+
+ # determine file decoding method | ustalanie sposobu dekodowania pliku
+function is_A85() {return (decodeline~/\/ASCII85Decode/)}
+function is_HEX() {return (decodeline~/\/ASCIIHexDecode/)}
+function is_LZW() {return (decodeline~/\/LZWDecode/)}
+function is_RLE() {return (decodeline~/\/RunLengthDecode/)}
+function is_ZIP() {return (decodeline~/\/FlateDecode/)}
diff --git a/support/pstools/cep/uncep.bat b/support/pstools/cep/uncep.bat
new file mode 100644
index 0000000000..20adbd6ed8
--- /dev/null
+++ b/support/pstools/cep/uncep.bat
@@ -0,0 +1,31 @@
+:: This file belongs to the CEP package | Ten plik nale/zy do pakietu CEP
+:: This package is public domain | Pakiet stanowi dobro powszechne
+:: For more info see `0CEP_LIC.ENG' | Wi/ecej informacji w ,,0CEP_LIC.POL''
+:: ===========================================================================
+:: E: A decompression program of EPS files compressed with CEP
+::
+:: P: Program do rozpakowywania plik/ow EPS spakowanych za pomoc/a CEP-a
+::
+@echo off
+if "%2"=="" goto USAGE
+if "%1"=="%2" goto USAGE
+if not exist %1 goto USAGE
+gawk32 -funcep.awk -vTMPSX=tmp.psx -vOUTF=%2 %1
+if errorlevel==1 goto DONE
+SET DOS4G=quiet
+if exist tmp.psx call gs386.exe -q -dNODISPLAY tmp.psx
+if exist tmp.psx del tmp.psx
+echo .
+goto DONE
+::
+:USAGE
+echo E: USAGE:
+echo uncep input_file output_file
+echo (decompression and decoding method is taken from input file;
+echo names of input_file and output_file must differ)
+echo.
+echo P: WYWO/LANIE:
+echo uncep plik_wej/sciowy plik_wyj/sciowy
+echo (metoda dekodowania jest ustalana na postawie pliku wej/sciowego;
+echo nazwa pliku wyj/sciowego musi by/c r/o/zna od nazwy pliku wej/sciowego)
+:DONE
diff --git a/support/pstools/cep/uncop.awk b/support/pstools/cep/uncop.awk
new file mode 100644
index 0000000000..6ea75e5f72
--- /dev/null
+++ b/support/pstools/cep/uncop.awk
@@ -0,0 +1,103 @@
+# This file belongs to the CEP package | Ten plik nale/zy do pakietu CEP
+# This package is public domain | Pakiet stanowi dobro powszechne
+# For more info see `0CEP_LIC.ENG' | Wi/ecej informacji w ,,0CEP_LIC.POL''
+# ===========================================================================
+# E: "COP filtered PS" --> "PS" converter
+# input - input file name
+# OUTF - output file name
+# TMPSX - temporary PostScript file name
+#
+# P: Konwerter "COP filtered PS" --> "PS"
+# wej/scie - nazwa pliku konwertowanego
+# OUTF - nazwa pliku wyj/sciowego
+# TMPSX - nazwa tymczasowego pliku PostScriptowego
+
+BEGIN {# preparing temporary files | przygotowywanie plik/ow tymczasowych
+ ver_no=1.03
+ gs_abort="2 2 .quit"
+ if (TMPSX=="") TMPSX="tmp.psx"
+ flag="was_begin"
+}
+
+ # check carefully whether the file to be processed was created by COP
+ # sprawd/xmy staranne czy mamy do czynienie z plikiem stworzonym przez COP-a
+
+/^%!PS-Adobe.* COP/ && flag~"was_begin" {flag="adobe"}
+/^%%BoundingBox/ && flag~"was_adobe" {flag="bbox"}
+/^%%Creator: COP/ && flag~"was_(adobe|bbox)" {flag="cops"}
+/^currentfile.*cvx exec$/ && flag~"was_cops" {decodeline=$0; exit}
+flag~"was" {exit}
+{flag="was_" flag}
+
+END {
+ # error handling | obs/luga b/l/ed/ow
+ if (decodeline=="") errmessage("not a COP file",1)
+ printf "UNCOP ver. " ver_no ", decoding:"
+ if (is_A85()) printf " A85"
+ if (is_HEX()) printf " Hex"
+ if (!is_HEX() && !is_A85()) printf " Bin"
+ if (is_LZW()) printf ", LZW"
+ if (is_RLE()) printf ", RLE"
+ if (is_ZIP()) printf ", Flate"
+ print ""
+ # WRITE PostScript ENCODING PROGRAM | TWORZENIE PROGRAMU Postscript-owego
+ out_ps_errorhandler()
+ # skipping preamble | pomijanie preambu/ly
+ out_ps("/b_string 4096 string def")
+ out_ps("(" ps_fname(FILENAME) ") (r) file")
+ for (i=1; i<=NR; ++i) out_ps("dup 255 string readline pop pop")
+ # prepare decoding | przygotowywanie filtr/ow dekoduj/acych
+ if (is_A85()) out_ps("/ASCII85Decode filter")
+ if (is_HEX()) out_ps("/ASCIIHexDecode filter")
+ if (is_LZW()) out_ps("/LZWDecode filter")
+ if (is_RLE()) out_ps("/RunLengthDecode filter")
+ if (is_ZIP()) out_ps("/FlateDecode filter")
+ out_ps("(" ps_fname(OUTF) ") (w) file")
+ out_ps("exch")
+ # loop decoding the Postscript file | p/etla dekoduj/aca plik Postscriptowy
+ out_ps("{dup b_string readstring")
+ out_ps("not exch 3 index exch")
+ out_ps("writestring {exit} if} loop")
+ out_ps("closefile closefile quit")
+ printf "."
+}
+
+function ps_fname(s) {gsub(/\\/,"/",s); return(s)}
+
+function out_ps(s) {print s > TMPSX}
+
+function out_ps_errorhandler() {
+ out_ps("/errq {" gs_abort "} def")
+ out_ps("errordict begin ")
+ out_ps("/ioerror {(\\010!Input/Output error occurred. (Disk full?)\\n\\007)")
+ out_ps(" print errq} def")
+ out_ps("/handleerror {$error begin (Something went wrong) print")
+ out_ps(" (\\n Error: ) print errorname 255 string cvs print")
+ out_ps(" (\\n\\007) print end errq} def")
+ out_ps("end")
+ #
+ out_ps("systemdict /resourcestatus known not")
+ out_ps("{(\\010!This version of Ghostscript doesn't support required Level 2 features\\n\\007)")
+ out_ps(" print quit} if")
+ if (is_A85()) check_filter("ASCII85Decode", "ASCII85Decode filter")
+ if (is_HEX()) check_filter("ASCIIHexDecode", "ASCIIHexDecode filter")
+ if (is_LZW()) check_filter("LZWDecode", "LZWDecode filter")
+ if (is_RLE()) check_filter("RunLengthDecode", "RunLengthDecode filter")
+ if (is_ZIP()) check_filter("FlateDecode", "FlateDecode filter")
+}
+ function check_filter(name, expl) {
+ out_ps("/" name " /Filter resourcestatus {pop pop}")
+ out_ps("{(\\010!This version of Ghostscript doesn't support " expl "\\n\\007)")
+ out_ps(" print errq} ifelse")
+ }
+
+function errmessage(errname, errnum) {
+ print "UNCOP ERROR:", errname "\007"; exit(errnum)
+}
+
+ # determine file decoding method | ustalanie sposobu dekodowania pliku
+function is_A85() {return (decodeline~/\/ASCII85Decode/)}
+function is_HEX() {return (decodeline~/\/ASCIIHexDecode/)}
+function is_LZW() {return (decodeline~/\/LZWDecode/)}
+function is_RLE() {return (decodeline~/\/RunLengthDecode/)}
+function is_ZIP() {return (decodeline~/\/FlateDecode/)}
diff --git a/support/pstools/cep/uncop.bat b/support/pstools/cep/uncop.bat
new file mode 100644
index 0000000000..f732d7ef86
--- /dev/null
+++ b/support/pstools/cep/uncop.bat
@@ -0,0 +1,31 @@
+:: This file belongs to the CEP package | Ten plik nale/zy do pakietu CEP
+:: This package is public domain | Pakiet stanowi dobro powszechne
+:: For more info see `0CEP_LIC.ENG' | Wi/ecej informacji w ,,0CEP_LIC.POL''
+:: ===========================================================================
+:: E: A decompression program of PS files compressed with COP
+::
+:: P: Program do rozpakowywania plik/ow PS spakowanych za pomoc/a COP-a
+::
+@echo off
+if "%2"=="" goto USAGE
+if "%1"=="%2" goto USAGE
+if not exist %1 goto USAGE
+gawk32 -funcop.awk -vTMPSX=tmp.psx -vOUTF=%2 %1
+if errorlevel==1 goto DONE
+SET DOS4G=quiet
+if exist tmp.psx call gs386.exe -q -dNODISPLAY tmp.psx
+if exist tmp.psx del tmp.psx
+echo .
+goto DONE
+::
+:USAGE
+echo E: USAGE:
+echo uncop input_file output_file
+echo (decompression and decoding method is taken from input file;
+echo names of input_file and output_file must differ)
+echo.
+echo P: WYWO/LANIE:
+echo uncop plik_wej/sciowy plik_wyj/sciowy
+echo (metoda dekodowania jest ustalana na postawie pliku wej/sciowego;
+echo nazwa pliku wyj/sciowego musi by/c r/o/zna od nazwy pliku wej/sciowego)
+:DONE