diff options
Diffstat (limited to 'Master/tlpkg/tlgs/Resource/Init/gs_dscp.ps')
-rw-r--r-- | Master/tlpkg/tlgs/Resource/Init/gs_dscp.ps | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_dscp.ps b/Master/tlpkg/tlgs/Resource/Init/gs_dscp.ps new file mode 100644 index 00000000000..5be220c5f2f --- /dev/null +++ b/Master/tlpkg/tlgs/Resource/Init/gs_dscp.ps @@ -0,0 +1,115 @@ +% 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. +% + +% Postscript interface routines to DSC parser + +/send_orientation { % <orientation> send_orientation - + % .parse_dsc_comments returns -1 for an Orientation key with an + % unrecognized value. + dup 0 ge { + << /Orientation 2 index >> setpagedevice + } if pop +} bind def + +% This dictionary contains local handlers for DSC comments. +% See header in zdscpars.c for more information. +% <dsc_dict> handler <dsc_dict> +/DSCparseprocs mark + /Orientation { dup /Orientation get send_orientation } bind + /PageOrientation { dup /PageOrientation .knownget { send_orientation } + { dup /Orientation .knownget { send_orientation } if } + ifelse } bind + /Page { dup /Orientation .knownget { send_orientation } if } bind + /NOP { } bind +.dicttomark readonly def + +% This procedure is called whenever a DSC comment is found by the interpreter +/do_parse_dsc //false def +/parse_dsc { % <file> <DSC string> [<prev proc>] + % parse_dsc - + % Run any previously installed parser. + 0 get dup //null eq { pop } { 3 copy exec pop } ifelse + + do_parse_dsc { % Check if this parser is enabled + currentglobal //true setglobal % Go to global VM, save old state + 3 1 roll % Put old VM state under <file> <string> + dsc_dict exch % <VM state> <file> <dict> <string> + .parse_dsc_comments % <VM state> <file> <dict> <DSC name> + 4 -1 roll % Get old VM state from under <file> <dict> <DSC name> + setglobal % restore previous VM state + //DSCparseprocs exch .knownget { % Check DSC name against local handler list + exec % execute any local handler + } if + } if + pop pop % remove file, dict +} bind def + +% Check whether the currently installed parser is the one defined in this file. +/.using_parse_dsc { % - .using_parse_dsc <proc> <using?> + currentuserparams /ProcessDSCComment get + dup //null eq { pop {{//null} //parse_dsc exec} } if + dup length 3 eq { + dup dup length 1 sub get /parse_dsc load eq + } { + //false + } ifelse +} bind def + +% Establish a binding for dsc_dict. +userdict /dsc_dict //null put + +% - dsc_init - +/dsc_init { % Initialize DSC parser + currentglobal //true setglobal + /dsc_dict 50 dict store % Size must be large enough for all DSC values + dsc_dict .initialize_dsc_parser + .using_parse_dsc { + % Already using this parser. + pop + } { + % Encapsulate the previous parser. We know it is in global VM: + % allocate the new one in global VM as well. + 1 array astore + /parse_dsc load /exec load 3 array astore cvx readonly + << /ProcessDSCComment 3 -1 roll >> + setuserparams + } ifelse + setglobal + /do_parse_dsc //true def +} bind def + +% Enable the DSC parser defined in this file. +% - enable_dsc - +/enable_dsc { + dsc_init +} bind def + +% Disable the DSC parser defined in this file. +% - disable_dsc - +/disable_dsc { + % There might be another parser installed: if so, restore it. + % (If it has encapsulated our parser, we can't.) + .using_parse_dsc { + % Restore the parser we encapsulated. + 0 get 0 get + currentglobal //true setglobal exch + << /ProcessDSCComment 3 -1 roll >> + exch setglobal setuserparams + } { + pop + } ifelse + % If we couldn't restore the old parser, at least disable ours. + /do_parse_dsc //false def +} bind def |