home *** CD-ROM | disk | FTP | other *** search
- % Copyright (C) 1991, 1992 Aladdin Enterprises. All rights reserved.
- % Distributed by Free Software Foundation, Inc.
- %
- % This file is part of Ghostscript.
- %
- % Ghostscript is distributed in the hope that it will be useful, but
- % WITHOUT ANY WARRANTY. No author or distributor accepts responsibility
- % to anyone for the consequences of using it or for whether it serves any
- % particular purpose or works at all, unless he says so in writing. Refer
- % to the Ghostscript General Public License for full details.
- %
- % Everyone is granted permission to copy, modify and redistribute
- % Ghostscript, but only under the conditions described in the Ghostscript
- % General Public License. A copy of this license is supposed to have been
- % given to you along with Ghostscript so you can know your rights and
- % responsibilities. It should be in a file named COPYING. Among other
- % things, the copyright notice and this notice must be preserved on all
- % copies.
-
- % Extract the ASCII text from a PostScript file. Nothing is displayed.
- % Instead, lines are written to stdout as follows:
- % F <height> <width> (<fontname>)
- % indicate font height and width of a space
- % S <x> <y> (<string>) <width>
- % display a string
- % P
- % end of page
- %
- % <height> is an integer expressed in tenths of a point
- % <width> is an integer in tenths of a point.
- % <x> and <y> are integer coordinates, in tenths of a point, with origin
- % at lower left.
- % <string> and <fontname> are string represented with the standard
- % PostScript escape conventions.
- % The idea is similar to Glenn Reid's `distillery', only a lot more
- % simple-minded, and less robust.
-
- % Note that this code will only work properly if systemdict is writable
- % and if `binding' the definitions of operators defined as procedures
- % is deferred. For this reason, it is normally invoked with
- % gs -q -dNOBIND -dWRITESYSTEMDICT gs_2asc.ps
-
- % Thanks to J Greely <jgreely@cis.ohio-state.edu> for improvements
- % to this code.
-
- /QUIET true def
- systemdict wcheck { systemdict } { userdict } ifelse begin
-
- % Disable the display operators.
-
- /eofill { newpath } odef
- /erasepage { } odef
- /fill { newpath } odef
- /stroke { newpath } odef
-
- % The image operators must read the input, but do nothing.
-
- /colorimage { gsave nulldevice //colorimage grestore } odef
- /image { gsave nulldevice //image grestore } odef
- /imagemask { gsave nulldevice //imagemask grestore } odef
-
- % Redefine the end-of-page operators.
-
- /copypage { (P\n) //print } odef
- /showpage { copypage erasepage initgraphics } odef
-
- % Redefine `show'.
-
- % Set things up so our output will be in tenths of a point, with origin at
- % lower left. This isolates us from the peculiarities of individual devices.
- /.show.ident.matrix matrix def
- /.show.ident
- { gsave initmatrix 0.1 dup scale .show.ident.matrix currentmatrix grestore
- } def
- /.coord { transform .show.ident itransform } odef
- /.dcoord { dtransform .show.ident idtransform } odef
- /.showfont
- %old code - This didn't work right for me with all fonts.
- %
- % { 0 currentfont /FontBBox get dup 3 get exch 1 get sub
- % currentfont /FontMatrix get dtransform dtransform
- % exch abs exch abs max round
- % (F ) //print //.stdout exch write==only (\n) //print
- % } odef
- %
- %unfortunately, my way bombs on one of my test files in
- %--%show_continue--(?!). It's from dvi2ps, which molests
- %the fonts in some way. --jgreely
- { (F ) //print
- gsave
- % figure out (roughly) the maximum height of the current
- % font. I picked this string for a mix of ascenders and
- % descenders, with digits tossed in in case of oldstyle
- newpath 0 0 moveto
- (Xyhq69) false charpath flattenpath pathbbox newpath
- exch 4 -1 roll sub 3 1 roll exch sub .dcoord
- round abs //.stdout exch write==only pop
- ( ) //print
- % oddly enough, the "charpath...pathbbox" stuff didn't work
- % right for space in courier
- ( ) stringwidth
- .dcoord pop
- round //.stdout exch write==only
- % ( ) //print
- % //.stdout currentfont /FontName get
- % dup type /nametype eq { =string cvs } if
- % write==only
- (\n) //print
- grestore
- } odef
-
- /.showstring
- { (S ) //print
- gsave
- currentpoint .coord
- exch round dup //.stdout exch write==only
- ( ) //print
- exch round dup //.stdout exch write==only
- ( ) //print
- moveto dup //.stdout exch write==only
- ( ) //print
- grestore dup stringwidth pop 0 rmoveto
- stringwidth .dcoord pop
- round //.stdout exch write==only
- (\n) //print
- } odef
-
- /show
- { .showfont .showstring
- } odef
-
- % Redefine the other string display operators in terms of `show'.
-
- /.show1 { ( ) dup 0 3 index put exch pop .showstring } odef
- /ashow
- { .showfont
- { .show1 2 copy rmoveto } forall
- exch neg exch neg rmoveto
- } odef
- /widthshow
- { .showfont
- { 2 copy .show1 eq { 1 index 2 index rmoveto } if } forall
- pop pop pop
- } odef
- /awidthshow
- { .showfont
- { dup .show1 3 index eq { 4 index 5 index rmoveto } if
- 2 copy rmoveto
- } forall
- exch neg exch neg rmoveto
- pop pop pop
- } odef
- /kshow
- { .showfont
- { .show1 dup exec } forall pop
- } odef
-
- % Redirect the printing operators.
-
- /.stdout (_temp_.out) (w) file def
- /.stderr (_temp_.err) (w) file def
- /print { //.stdout exch writestring } odef
-
- end
-
- % Bind the operators we just defined, and all the others if we didn't
- % do it before.
-
- bindoperators
- NOBIND currentdict systemdict ne and
- { systemdict begin bindoperators end }
- if
-
- % Make systemdict read-only if it wasn't already.
-
- systemdict wcheck { systemdict readonly pop } if
-