summaryrefslogtreecommitdiff
path: root/Master/xemtex/gslib/gs_dscp.ps
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2005-12-28 00:07:27 +0000
committerKarl Berry <karl@freefriends.org>2005-12-28 00:07:27 +0000
commit30dd9f517c9c093ff3319061647a4555264f7914 (patch)
tree0d7a349bf99be5a42cc9c5a80a30f3b7136c4ccd /Master/xemtex/gslib/gs_dscp.ps
parent08ab8dce83f53b0f915cb66a37bbc8478b22c307 (diff)
trunk
git-svn-id: svn://tug.org/texlive/trunk@9 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/xemtex/gslib/gs_dscp.ps')
-rw-r--r--Master/xemtex/gslib/gs_dscp.ps119
1 files changed, 119 insertions, 0 deletions
diff --git a/Master/xemtex/gslib/gs_dscp.ps b/Master/xemtex/gslib/gs_dscp.ps
new file mode 100644
index 00000000000..355e9d9e0f5
--- /dev/null
+++ b/Master/xemtex/gslib/gs_dscp.ps
@@ -0,0 +1,119 @@
+% Copyright (C) 2000 Artifex Software Inc. 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_dscp.ps,v 1.4.2.1.2.1 2003/04/12 14:02:38 giles Exp $
+% 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