diff options
Diffstat (limited to 'Master/xemtex/gslib/gs_epsf.ps')
-rw-r--r-- | Master/xemtex/gslib/gs_epsf.ps | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/Master/xemtex/gslib/gs_epsf.ps b/Master/xemtex/gslib/gs_epsf.ps new file mode 100644 index 00000000000..97d93b58622 --- /dev/null +++ b/Master/xemtex/gslib/gs_epsf.ps @@ -0,0 +1,243 @@ +% Copyright (C) 1989, 1996, 2002 Aladdin Enterprises. All rights reserved. +% +% This program is free software; you can redistribute it and/or modify it +% under the terms of the GNU General Public License as published by the +% Free Software Foundation; either version 2 of the License, or (at your +% option) any later version. +% +% This program is distributed in the hope that it will be useful, but +% WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +% Public License for more details. +% +% You should have received a copy of the GNU General Public License along +% with this program; if not, write to the Free Software Foundation, Inc., +% 59 Temple Place, Suite 330, Boston, MA, 02111-1307. + +% $Id: gs_epsf.ps,v 1.2.6.11.2.3 2003/04/12 14:02:38 giles Exp $ +% Allow the interpreter to encapsulate EPS files, to recognize MS-DOS +% EPSF file headers, and skip to the PostScript section of the file. + +% Encapsulate EPS files and optionally resize page or rescale image. +% To display an EPS file cropped to the bounding box: +% gs -dEPSCrop file.eps +% To display an EPS file scaled to fit the page: +% gs -dEPSFitPage file.eps +% To display a file without EPS encapsulation: +% gs -dNOEPS file.ps + +% When starting to process an EPS file, state is 0. +% After %%BoundingBox processed, state is 1. +% After %%HiResBoundingBox processed, state is 2. +% After %%EndComments processed, state is 3. +/EPSBoundingBoxState 3 def +/EPSBoundingBoxSetState { + //systemdict /EPSBoundingBoxState 3 -1 roll .forceput +} .bind odef % .forceput must be bound and hidden + +% Parse 4 numbers for a bounding box +/EPSBoundingBoxParse { % (llx lly urx ury) -- llx lly urx ury true OR false + mark exch + token {exch token {exch token {exch token {exch pop} if} if} if} if + counttomark + 4 eq { + 5 -1 roll pop % remove mark + true + } { + cleartomark false + } ifelse +} bind def + +% Rescale and translate to fit the BoundingBox on the page +/EPSBoundingBoxFitPage { % llx lly urx ury -- + DEBUG { (gs_epsf.ps: Rescaling EPS to fit page\n) print flush } if + clippath pathbbox newpath + % translate to new origin at lower left of clippath + 3 index 3 index translate + % calculate scale to fit smaller of width or height + exch 4 -1 roll sub 3 1 roll exch sub + 4 2 roll 5 index 5 index 4 2 roll + exch 4 -1 roll sub 3 1 roll exch sub + 4 2 roll + exch 4 -1 roll div 3 1 roll exch div + 1 index 1 index lt {pop}{exch pop} ifelse + dup scale + % translate to EPS -llx,-lly + exch neg exch neg translate +} bind def + +% Crop the page to the BoundingBox +/EPSBoundingBoxCrop { % llx lly urx ury -- + DEBUG { + (gs_epsf.ps: Setting pagesize from EPS bounding box\n) print flush + } if + exch 3 index sub exch 2 index sub % stack: llx lly urx-llx ury-lly + << /PageSize [ 5 -2 roll ] >> setpagedevice + neg exch neg exch translate +} bind def + + +/EPSBoundingBoxProcess { % (llx lly urx ury) state -- + //systemdict /EPSBoundingBoxState get 1 index lt { + exch EPSBoundingBoxParse + { + //systemdict /EPSCrop known { + EPSBoundingBoxCrop + } { + //systemdict /EPSFitPage known { + EPSBoundingBoxFitPage + } { + % Warn if some of the EPS file will be clipped + clippath pathbbox newpath + { % context for exit + 5 -1 roll lt { 6 { pop } repeat true exit } if + 4 -1 roll lt { 4 { pop } repeat true exit } if + 3 -1 roll gt { 2 { pop } repeat true exit } if + exch gt { true exit } if + false exit + } loop + QUIET not and { + (\n **** Warning: Some of the BoundingBox for the EPS file will be clipped.) = + ( Use -dEPSCrop or -dEPSFitPage to avoid clipping.\n) = + flush + } if + } ifelse + } ifelse + EPSBoundingBoxSetState + } { + pop % state + } ifelse + } { + pop pop + } ifelse +} bind def + +/ProcessEPSComment { % file comment -- file comment + //systemdict /EPSBoundingBoxState get 3 lt { + dup + (%%EndComments) anchorsearch { + pop pop + % ignore any following bounding boxes + 3 EPSBoundingBoxSetState + } { + (%%BoundingBox:) anchorsearch { + pop + DEBUG { (gs_epsf.ps: found %%BoundingBox\n) print flush } if + 1 EPSBoundingBoxProcess + } { + (%%HiResBoundingBox:) anchorsearch { + pop + DEBUG { (gs_epsf.ps: found %%HiResBoundingBox\n) print flush } if + 2 EPSBoundingBoxProcess + } { + pop % Not interested in this DSC comment + } ifelse + } ifelse + } ifelse + } if +} bind def + +% Install EPS handler for DSC comments, which we do later +/EPSBoundingBoxInit { + systemdict /NOEPS known not { + % Merge ProcessEPSComment with existing handler + /ProcessEPSComment load /exec load + currentuserparams /ProcessDSCComment get + dup null eq {pop {pop pop}} if /exec load + 4 array astore cvx readonly + << /ProcessDSCComment 3 -1 roll >> setuserparams + } if +} bind def + +/.runNoEPS /run load def + +/.runEPS { % file OR string -- + /runEPS_save save def + /runEPS_dict_count countdictstack def + /runEPS_op_count count 2 sub def + /runEPS_page_count currentpagedevice /PageCount get def + 0 EPSBoundingBoxSetState + .runNoEPS + currentpagedevice /PageCount get runEPS_page_count sub 0 eq + { /showpage load exec } if + count runEPS_op_count sub {pop} repeat + countdictstack runEPS_dict_count sub {end} repeat + runEPS_save restore +} bind def + +/run { % file OR string -- + dup type /filetype ne { (r) file } if + dup (%!PS-Adobe-) .peekstring { + (%!PS-Adobe-) eq { + dup (%!PS-Adobe-X.X EPSF-X.X) .peekstring { + (EPSF) search { + pop pop pop + DEBUG {(runEPS: Found EPS\n) print flush} if + systemdict /NOEPS known { + cvx .runNoEPS + } { + cvx .runEPS + } ifelse + } { + DEBUG {(runEPS: Normal DSC\n) print flush} if + pop + cvx .runNoEPS + + } ifelse + } { + DEBUG {(runEPS: Short DSC\n) print flush} if + pop + cvx .runNoEPS + } ifelse + } { + DEBUG {(runEPS: Not DSC\n) print flush} if + cvx .runNoEPS + } ifelse + } { + DEBUG {(runEPS: Short non-DSC\n) print flush} if + pop + cvx .runNoEPS + } ifelse +} bind odef + + +% Handle DOS EPS files. + +/.runnoepsf /run load def +/.epsfheader <C5D0D3C6> def +/run + { dup type /filetype ne { (r) file } if + % Check for MS-DOS EPSF file (see Red Book p. 729). + dup ( ) .peekstring + { .epsfheader eq { dup ( ) readstring exch pop } { false } ifelse } + { pop false } + ifelse + % Stack: file true/false + { % This block is executed if the file is MS-DOS EPSF. + % Build up the little-endian byte offset and length. + 2 + { 1 0 4 + { 2 index read not { pop exit } if % if EOF, let error happen + 2 index mul add exch 256 mul exch + } + repeat exch pop exch + } + repeat + % Stack: offset length file + % Use flushfile to skip quickly to the start of the + % PostScript section. + dup 4 -1 roll 12 sub () /SubFileDecode filter flushfile + % Now interpret the PostScript. + exch () /SubFileDecode filter cvx run + } + { .runnoepsf + } + ifelse + } odef + +% rebind .runstdin to use redefined run +userdict begin +/.runstdin { + { (%stdin) run } execute0 +} bind def +end |