diff options
Diffstat (limited to 'Master/tlpkg/tlgs/Resource/Init/gs_epsf.ps')
-rw-r--r-- | Master/tlpkg/tlgs/Resource/Init/gs_epsf.ps | 291 |
1 files changed, 291 insertions, 0 deletions
diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_epsf.ps b/Master/tlpkg/tlgs/Resource/Init/gs_epsf.ps new file mode 100644 index 00000000000..1ed7e1cbb2e --- /dev/null +++ b/Master/tlpkg/tlgs/Resource/Init/gs_epsf.ps @@ -0,0 +1,291 @@ +% Copyright (C) 2001-2012 Artifex Software, Inc. +% All Rights Reserved. +% +% This software is provided AS-IS with no warranty, either express or +% implied. +% +% This software is distributed under license and may not be copied, +% modified or distributed except as expressly authorized under the terms +% of the license contained in the file LICENSE in this distribution. +% +% Refer to licensing information at http://www.artifex.com or contact +% Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, +% CA 94903, U.S.A., +1(415)492-9861, for further information. +% + +% 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 if OK or 2 if cropped. +% After %%HiResBoundingBox processed, state is 3 if OK or 4 if cropped. +% After %%EndComments processed, state is 5. +/EPSBoundingBoxState 5 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 + +% Crop the page to the BoundingBox +/EPSBoundingBoxCrop { % llx lly urx ury -- + EPSDEBUG { + (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 + +% Rescale, translate and rotate to fit the BoundingBox on the page +/EPSBoundingBoxFitPage { % llx lly urx ury -- + EPSDEBUG { (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 + % Figure out if rotate is needed. + + 1 index 4 index sub 1 index 4 index sub eq not { + 1 index 4 index sub 1 index 4 index sub gt % bbox page-clipbox page-is-landscape + 6 index 10 index sub 6 index 10 index sub gt % bbox page-clipbox page-is-landscape bbox-is-landscape + xor + }{ + false + }ifelse + 9 1 roll % compute need-rotate. + % stack: rotate-needed bbox page-clipbox + % 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 + % Finally perform the rotate if needed. + { clippath pathbbox pop 0 exch translate 90 rotate pop pop } if +} 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 /EPSBoundingBoxState .systemvar 1 and 1 eq and { + (\n **** Warning: Some of the BoundingBox for the EPS file will be clipped.) = + ( Use -dEPSCrop or -dEPSFitPage to avoid clipping.\n) = + flush + 1 add + } if + } ifelse + } ifelse + EPSBoundingBoxSetState + } { + pop % state + } ifelse + } { + pop pop + } ifelse +} bind def + +/ProcessEPSComment { % file comment -- file comment + /EPSBoundingBoxState .systemvar 3 lt { + dup + (%%BoundingBox:) anchorsearch { + pop + EPSDEBUG { (gs_epsf.ps: found %%BoundingBox\n) print flush } if + 1 EPSBoundingBoxProcess + } { + (%%HiResBoundingBox:) anchorsearch { + pop + EPSDEBUG { (gs_epsf.ps: found %%HiResBoundingBox\n) print flush } if + 3 EPSBoundingBoxProcess + } { + pop % Not interested in this DSC comment + } ifelse + } ifelse + } if + /EPSBoundingBoxState .systemvar 5 lt { + dup (%%DocumentCustomColors:) anchorsearch { + pop + [ exch + { { + token not { exit } if + dup type /stringtype ne { stop } if + dup (atend) eq { stop } if + exch + } loop + { + counttomark 2 add index + dup (123) .peekstring not { stop } if + (%%+) eq { + dup (123) readstring pop pop + 256 string readline pop + cvx exec + } { + pop exit + } ifelse + } loop + } stopped { + cleartomark + } { + counttomark 0 gt { + currentpagedevice /MaxSeparations get 4 gt { + ] << /SeparationColorNames 3 -1 roll >> setpagedevice + } { + cleartomark + } ifelse + } { + cleartomark + } ifelse + } ifelse + } { + (%%EndComments) anchorsearch { + pop pop + % Ignore any following comments + 5 EPSBoundingBoxSetState + } { + pop + } 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 + EPSDEBUG {(runEPS: Found EPS\n) print flush} if + systemdict /NOEPS known { + cvx .runNoEPS + } { + cvx .runEPS + } ifelse + } { + EPSDEBUG {(runEPS: Normal DSC\n) print flush} if + pop + cvx .runNoEPS + + } ifelse + } { + EPSDEBUG {(runEPS: Short DSC\n) print flush} if + pop + cvx .runNoEPS + } ifelse + } { + EPSDEBUG {(runEPS: Not DSC\n) print flush} if + cvx .runNoEPS + } ifelse + } { + EPSDEBUG {(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 |