diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/pstools/cep |
Initial commit
Diffstat (limited to 'support/pstools/cep')
-rw-r--r-- | support/pstools/cep/0cep_lic.eng | 48 | ||||
-rw-r--r-- | support/pstools/cep/0cep_lic.pol | 50 | ||||
-rw-r--r-- | support/pstools/cep/cep.awk | 205 | ||||
-rw-r--r-- | support/pstools/cep/cep.bat | 48 | ||||
-rw-r--r-- | support/pstools/cep/cepcop_e.inf | 371 | ||||
-rw-r--r-- | support/pstools/cep/cepcop_p.inf | 478 | ||||
-rw-r--r-- | support/pstools/cep/cop.awk | 143 | ||||
-rw-r--r-- | support/pstools/cep/cop.bat | 49 | ||||
-rw-r--r-- | support/pstools/cep/uncep.awk | 140 | ||||
-rw-r--r-- | support/pstools/cep/uncep.bat | 31 | ||||
-rw-r--r-- | support/pstools/cep/uncop.awk | 103 | ||||
-rw-r--r-- | support/pstools/cep/uncop.bat | 31 |
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
|